4. 固件模拟运行环境搭建
任务目标
使用QEMU的系统级模拟(System Mode)搭建一个完整的Linux用户态模拟环境,使目标固件(以OpenWrt的squashfs根文件系统为例)中的二进制程序能够在x86主机上直接执行,并能够通过chroot进入该环境进行动态调试与分析。
环境依赖
- Ubuntu 20.04+ / Debian 11+(x86_64主机)
- QEMU(含
qemu-system-mips等目标架构支持) binutils-mips-linux-gnu(交叉工具链,用于提取和修复ELF解释器)squashfs-tools(解包固件文件系统)
sudo apt update
sudo apt install -y qemu-system-mips qemu-user-static binutils-mips-linux-gnu squashfs-tools
实现步骤与关键代码
1. 解包固件根文件系统
假设已从固件中提取出squashfs镜像(例如root.squashfs),执行解包:
mkdir -p ~/firmware/rootfs
cd ~/firmware/rootfs
unsquashfs ../root.squashfs
# 解包后根目录位于 squashfs-root/
2. 准备QEMU用户态模拟环境
将QEMU用户态模拟器复制到目标根文件系统中,并修复动态链接器路径:
cd ~/firmware/rootfs/squashfs-root
cp /usr/bin/qemu-mips-static ./usr/bin/
# 修复ELF解释器路径(关键步骤)
sudo chroot . /usr/bin/qemu-mips-static /bin/busybox --help 2>&1 | head -5
# 若报错 "No such file or directory",说明解释器路径不匹配,需手动修正:
sudo ln -sf /lib/ld.so.1 ./lib/ld.so.1 # 根据实际架构调整
3. 编写自动挂载与chroot脚本
创建run_firmware.sh,实现一键进入模拟环境:
#!/bin/bash
# 用法: ./run_firmware.sh [命令]
ROOTFS=~/firmware/rootfs/squashfs-root
QEMU=/usr/bin/qemu-mips-static
# 挂载宿主机 /proc 和 /dev 到目标根文件系统
sudo mount -t proc /proc ${ROOTFS}/proc
sudo mount --bind /dev ${ROOTFS}/dev
sudo mount --bind /dev/pts ${ROOTFS}/dev/pts
# 进入chroot环境执行命令(默认启动shell)
sudo chroot ${ROOTFS} /usr/bin/qemu-mips-static ${1:-/bin/sh}
# 退出后卸载
sudo umount ${ROOTFS}/proc
sudo umount ${ROOTFS}/dev/pts
sudo umount ${ROOTFS}/dev
chmod +x run_firmware.sh
./run_firmware.sh # 进入模拟的MIPS shell
4. 验证模拟环境可用性
在chroot环境中执行以下命令验证:
# 在模拟的MIPS shell中执行
/bin/busybox arch # 应输出 mips 或 mipsel
/bin/busybox cat /proc/cpuinfo | head -3 # 查看CPU信息
/bin/busybox ls /bin/ # 列出固件中的二进制
验证方法与判定标准
- 架构验证:执行
arch命令输出为mips(或固件实际架构),证明QEMU模拟生效。 - 文件系统完整性:
ls /bin能看到固件原有的BusyBox工具链,且/proc挂载正常(能读取CPU信息)。 - 动态执行能力:运行固件中任意依赖动态链接的二进制(如
/usr/sbin/dropbear),不出现No such file or directory或段错误,即表示解释器路径修复成功。 - 退出与清理:执行
exit退出chroot后,宿主机mount列表无残留挂载点。
常见问题与修复
- 执行二进制报"Exec format error":确认QEMU静态二进制架构与固件匹配(mips vs mipsel vs mips64)。
- 报"No such file or directory"但文件存在:动态链接器路径错误,用
readelf -l 目标二进制查看interpreter段实际路径,并在rootfs中创建对应软链接。 - /proc挂载失败:确保以root运行脚本,且宿主机
/proc已正常挂载。
此环境搭建完成后,即可在宿主机上对固件内任意二进制进行gdb调试、运行时监控或Fuzzing测试,为后续漏洞挖掘提供基础执行环境。