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测试,为后续漏洞挖掘提供基础执行环境。