executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
re-fw-emulate固件仿真:QEMU 用户态/全系统。 触发词:仿真、QEMU、firmadyne、跑固件
Independent GitHub snapshot · Automated classification · Original documentation governs
所有工具先验证再使用。仿真 = 动态执行,默认沙箱 + 网络隔离([[re-analyze/platform-tips]] 最高原则);用户态仿真优先(最轻可行方案)。
apt install qemu-user / dnf install qemu-user / pacman -S qemu-userbrew install qemu(含用户态与系统态)qemu-arm --version、qemu-mips --version(大端)、qemu-mipsel --version(小端)apt install qemu-system-arm qemu-system-mips / dnf install qemu-system-arm qemu-system-mips / pacman -S qemu-system-arm qemu-system-mipsbrew install qemuqemu-system-arm --versionapt install binfmt-support qemu-user-static(Debian/Ubuntu 装 qemu-user-static 即自动注册各架构 binfmt 条目;Fedora 用 systemd binfmt 配置);手动注册: update-binfmts --enable qemu-arm(或 /etc/binfmt.d/ 配置文件)qemu-<arch> 显式调用ls /proc/sys/fs/binfmt_misc/ 可见 qemu-arm 条目;之后可直接执行 ./rootfs_out/usr/sbin/httpdapt install gdb-multiarch / dnf install gdb-multiarch / pacman -S gdb-multiarch;gdbserver: apt install gdbserver(或随 gdb 包提供)brew install gdb(需 Developer Tools 授权,见 [[re-analyze/platform-tips]] macOS 分支)或 WSL 内 Linux 版gdb-multiarch --versiongit clone https://github.com/firmadyne/firmadyne,依赖 qemu-system-* 与预编译内核(scripts/ 下下载),首次搭建较重ls sources/ 有 getArch.py 等脚本;which qemu-system-mips按顺序执行,每步记下结果。
用户态仿真(最轻,优先):
file rootfs_out/usr/sbin/httpd # 确认架构:ARM 32/64、MIPS(BE/EL)、RISC-V
qemu-arm -L rootfs_out rootfs_out/usr/sbin/httpd # -L 把 rootfs 当 sysroot(动态库/链接器从 rootfs 加载)
# 大端 MIPS: qemu-mips -L rootfs_out ...
# 小端 MIPS: qemu-mipsel -L rootfs_out ...
缺库报错 → 交叉 ldd / readelf -d 看依赖,从 rootfs 补库;Web 服务类程序可加 -E 传环境变量。
-strace 记录客户程序系统调用(等效仿真内 strace——排查 mmap/ioctl 崩溃点直接用它)-0 <argv0> 伪造 argv[0](程序按调用名分支时用);-cpu <型号> 指定 CPU(如 qemu-arm -cpu cortex-a9)全系统仿真:
# ARM(vexpress 平台)+ 内核与 initramfs:
qemu-system-arm -M vexpress-a9 -kernel vmlinuz -initrd initramfs.img -nographic \
-append "console=ttyAMA0 root=/dev/ram rdinit=/sbin/init"
# MIPS(malta 平台,大端示例):
qemu-system-mips -M malta -kernel vmlinuz -initrd initramfs.img -nographic \
-append "console=ttyS0 rdinit=/sbin/init"
把 rootfs 制作成磁盘镜像(ext2 挂 root)或 initramfs(cpio 打包 rootfs_out);firmadyne 的脚本就是自动化这套流程。 rootfs 已是磁盘镜像时直接挂盘:
qemu-system-arm -M vexpress-a9 -kernel vmlinuz -drive file=rootfs.ext2,format=raw \
-nographic -append "console=ttyAMA0 root=/dev/mmcblk0 rdinit=/sbin/init"
root 设备名按平台磁盘控制器定(vexpress=mmcblk0、malta 的 IDE=/dev/sda 等,以 -M 平台文档为准)。
外设缺失用 stub/回环:
strace 定位访问点,LD_PRELOAD 提供 stub 库返回假寄存器值-device 挂虚拟外设(e1000 / virtio 等);真实芯片外设(wifi/基带)QEMU 无法模拟 → 打补丁跳过初始化或 stub 该 ioctl交叉调试(qemu -g + gdb-multiarch):
qemu-arm -g 1234 -L rootfs_out rootfs_out/usr/sbin/httpd & # -g 起 gdbstub
gdb-multiarch rootfs_out/usr/sbin/httpd
(gdb) target remote :1234
全系统内:把 gdbserver 放进 rootfs,gdbserver :1234 /usr/sbin/httpd,宿主 target remote <qemu_ip>:1234;调试手法按 [[re-gdb]]。
网络隔离下仿真:
-nic none 确认行为,需要受控网络再加 -nic user,restrict=on(用户态 NAT,仅模拟出站)file/readelf 确认架构与字节序(大端 mips ≠ mipsel);对策——步骤 1 先确认,选对 qemu--device <型号> 等虚拟网卡,或先 -nic none 观察是否跳过(步骤 5)-rtc base=utc 固定,或 stub 掉 clock_gettime 相关调用-nic none,用户态也非网络沙箱(步骤 5),回连分析前按 [[re-analyze/platform-tips]] 隔离