五、QEMU+MIPS环境搭建实战:从零构建路由器固件分析环境
1. 为什么需要QEMUMIPS环境逆向分析路由器固件时最头疼的就是目标设备的硬件限制。大多数家用路由器都是基于MIPS架构设计的但它们的硬件资源非常有限通常只有几十MB内存更别提安装调试工具了。我在分析某品牌路由器时就遇到过这种情况——设备连最基本的gdb都没有更不用说运行IDA远程调试器了。这时候QEMU就派上用场了。它就像个万能翻译官能让x86电脑理解并运行MIPS架构的程序。我特别喜欢它的两个工作模式User模式适合快速测试单个程序System模式则能模拟整个操作系统环境。去年分析一个漏洞时我就是在QEMU里完整复现了路由器的运行环境连Web管理界面都能正常访问。2. 环境准备与基础安装2.1 选择适合的操作系统推荐使用Ubuntu 18.04/20.04 LTS版本这两个版本对QEMU的支持最稳定。我在CentOS 7上折腾过结果各种依赖问题搞得头大。如果要用其他发行版记得提前安装这些基础依赖sudo apt-get install build-essential zlib1g-dev libglib2.0-dev libpixman-1-dev2.2 安装QEMU全家桶Ubuntu源里的QEMU版本可能比较老建议用这个命令安装完整组件sudo apt-get install qemu-system-mips qemu-user-static qemu-utils这里有个坑要注意qemu-user-static必须装它是能在chroot环境下运行的关键。去年帮学弟调试时他漏装了这个包结果死活跑不起来固件里的程序。3. User模式实战运行单个程序3.1 交叉编译环境搭建先装MIPS版的GCC工具链sudo apt-get install gcc-mips-linux-gnu测试下编译器是否正常// hello.c #include stdio.h int main() { printf(MIPS程序跑起来啦\n); return 0; }编译时务必加**-static**参数mips-linux-gnu-gcc -static hello.c -o hello3.2 运行与调试技巧用QEMU运行刚编译的程序qemu-mips-static ./hello如果想调试可以这样启动qemu-mips-static -g 1234 ./hello 然后在另一个终端用gdb-multiarch连接gdb-multiarch ./hello (gdb) target remote :12344. 实战路由器固件分析4.1 固件解包与挂载以TP-Link某型号固件为例先用binwalk解包binwalk -Me firmware.bin进入解压出的squashfs-root目录准备QEMU环境cp $(which qemu-mips-static) . sudo chroot . ./qemu-mips-static /bin/sh这时候你就进入了虚拟的MIPS环境可以执行ls、ps等命令了。不过要注意很多路由器用的都是精简版BusyBox功能比较有限。4.2 解决动态库问题遇到not found错误时可能是动态库路径不对。试试这样sudo chroot . ./qemu-mips-static -L /lib /bin/ls-L参数指定库文件搜索路径。有次我分析D-Link固件时它的库文件藏在/usr/lib下折腾了好久才发现这个问题。5. System模式完整系统模拟5.1 准备Debian镜像下载预编译的MIPS镜像wget https://people.debian.org/~aurel32/qemu/mips/debian_wheezy_mips_standard.qcow2启动命令比User模式复杂些qemu-system-mips -M malta -kernel vmlinux-3.2.0-4-4kc-malta \ -hda debian_wheezy_mips_standard.qcow2 \ -append root/dev/sda1 consoletty0 \ -nographic5.2 网络配置技巧想让虚拟机访问外网需要添加网卡参数-net nic -net tap,ifnametap0,scriptno主机上还要配置TAP设备sudo tunctl -u $(whoami) -t tap0 sudo ifconfig tap0 192.168.100.1 up这样虚拟机里配置192.168.100.2的IP就能和主机通信了。6. 常见问题排坑指南问题1运行时报Invalid ELF image解决方法检查固件是big-endian还是little-endian对应使用qemu-mips或qemu-mipsel问题2chroot后提示权限被拒绝解决方法加上-E参数保留环境变量sudo chroot . ./qemu-mips-static -E /bin/ls问题3System模式启动卡住解决方法尝试更换内核版本有些老固件需要2.6版本的内核有次分析华为路由器固件时我同时遇到了这三个问题最后发现是因为固件用了mips64el架构必须用qemu-mips64el-static才能跑。所以遇到问题时要耐心架构匹配是成功的关键。