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
这也就是配置网卡和网络设备

一个仍在爬山的人