QEMU
关于QEMU详细实现在硬件fuzz中有提到
安装与配置
安装QEMU:
sudo apt install qemu-system* qemu-utils qemu-user
安装与启用KVM:
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager
sudo modprobe -a kvm kvm_intel
安装目标系统Lib(同时安装交叉编译工具):
sudo apt install gcc-arm* gcc-aarch64* gcc-mips*
仿真准备
提取固件文件系统:
binwalk -Me <固件>
配置网络环境:
sudo brctl addbr Virbr0
sudo ifconfig Virbr0 192.168.100.1/24 up
sudo tunctl -t tap0
sudo ifconfig tap0 192.168.100.11/24 up
sudo brctl addif Virbr0 tap0
制作cpio归档:
cd 固件/<fs目录>/
find . | cpio -o -H newc | gzip > ../rootfs.cpio.gz
开始仿真
用户模式仿真
用户模式下有静态链接和动态链接的两种版本,区别在于是否有static
如果使用了chroot,动态链接版本将找不到相应的lib无法运行
(推荐)使用chroot做“临时沙箱”:
cd <提取后的固件目录>
sudo cp $(witch qemu-<架构>-static) /目标fs目录/
sudo chroot ./ ./qemu-<架构>-static ./bin/execfile
如果需要做hook:
sudo env LD_PRELOAD=/hook.so chroot ./ ./qemu-<架构> ./bin/execfile
全系统模式仿真
全系统仿真常用命令为:
qemu-system-<架构> \
-M <主板型号/virt/malta> \
-kernel <> \
# -hda <> \
-initrd rootfs.cpio.gz\
-append <> \
-netdev tap, id=tapnet,ifname=tap0,script=no \
-device <网卡驱动>,netdev=tapnet \
-nographic
参数怎么填?
-kernel内核:
根据信息尽可能寻找可用的内核版本
-M主板型号:
根据内核的版本,找得到就填相应的,实在找不到就virt或者malta
-initrd加载根文件系统:
将制作的fs归档在启动时挂载上,这样就不用在后续手动挂载文件系统了
-hda:
如果没有在qemu开启的时候挂载则方法有所不同,这样就需要找相应的镜像先启动,后续再挂载上去
https://people.debian.org/~aurel32/qemu/
mount -o bind /dev ./fs-root/dev/
mount -t proc /proc/ ./fs-root/proc/
chroot fs-root /bin/sh
-append启动参数:
如果用initrd挂载则root是在内存中即/dev/ram0
如果用hda挂载则root在硬盘中即/dev/sda1
root=/dev/xxx console=tty0 ip=192.168.100.10::192.168.100.1:255.255.255.0::eth0:none
-netdev、-device:
这也就是配置网卡和网络设备