因为最近的项目原因,需要了解一下固件仿真的知识。网络上搜索了一下,基本上不外乎Qemu、Firmadyne、firmAE、FAP(Firmware Analysis Plus)这几种方式,但是归根结底都是基于Qemu做了一些优化、集成、自动化之类的。所以本着学习与探索的态度,准备直接从固件仿真的老祖宗——Qemu入手,本文主要介绍了Linux下(博主基于Linux-Mint-20.3-xfce-64bit)编译安装Qemu的过程。
下载源码包
$ wget https://download.qemu.org/qemu-8.2.0-rc1.tar.xz
解压
$ tar xvJf qemu-8.2.0-rc1.tar.xz
$ cd qemu-8.2.0-rc1/
看一下configure的选项
$ ./configure --help
用最简单的形式进行configure
$ ./configure
貌似缺少pip,根据提示应该需要安装python3-venv,手动安装一下。
直接apt安装即可
$ sudo apt install python3-venv
再次编译
一个坑接着一个坑,貌似缺少sphinx和Ninja,继续填坑。
先安装pip
$ sudo apt install python3-pip
再安装sphinx
$ pip install sphinx
涉及到的东西貌似还挺多
虽然有些warning,但是貌似Ninja也安装上了
再次编译
没有想象的那么简单啊,sphinx_rtd_theme还是有些问题。先卸载安装的sphinx
$ pip uninstall sphinx
然后安装上面报错缺少的sphinx 5.3.0版本。
$ pip install "Sphinx==5.3.0"
再次configure
$./configure
同样的问题,还是直接安装这个sphinx_rtd_theme吧
$ pip install sphinx-rtd-theme
再次configure
继续填坑,安装一下ninja-build
$ sudo apt install ninja-build
$ sudo apt install libglib2.0-0 libglib2.0-dev
$ make && make install
安装完成后在/usr/loacal/bin下会生成相应的可执行文件。
https://pan.baidu.com/s/1soGEzvU1dBHau-r0WTFaNQ
$ binwalk -Me HG532eV100R001C01B020_upgrade_packet.bin
从这里可以看出是Squashfs标准文件类型,big endian大端序。
squashfs-root目录下竟然是空的,从上面的binwalk解析过程也可以看出来,貌似squashfs文件解析出问题,应该是没有安装sasquatch,手工安装一下。
重要的事情说三遍,一定要按照我这个方式安装,否则会有深坑,以后再解释。
$ wget https://github.com/devttys0/sasquatch/pull/47.patch && patch -p1 < 47.patch && sudo ./build.sh
顺利安装sasquatch。
$ binwalk -Me HG532eV100R001C01B020_upgrade_packet.bin
接下来看看系统使用的指令集,在解包后的bin目录下,随便找两三个可执行程序看一下。
可以看到,都是32为的MIPS,所以接下来我们通过qemu仿真的时候选择32位,使用MIPS内核。
先下载mips内核(地址:https://people.debian.org/~aurel32/qemu/mips/
),下载后放到工作目录下,如下图。
$ qemu-system-mips -M malta -kernel ./mips/vmlinux-2.6.32-5-4kc-malta -hda ./mips/debian_squeeze_mips_standard.qcow2 --append "root=/dev/sda1 console=tty0" -net nic -net tap,ifname=ens33
查看宿主机网络信息。
$ ip a
本次组网采用模式(qemu还支持其他的组网方式,后续再研究)。
编辑两个文件:
/usr/local/etc/qemu-ifup,内容如下
/usr/local/etc/qemu-ifdown,内容如下
通过下面的命令创建qemu虚拟机
$ sudo qemu-system-mips -M malta -kernel ./mips/vmlinux-2.6.32-5-4kc-malta -hda ./mips/debian_squeeze_mips_standard.qcow2 --append "root=/dev/sda1 console=tty0" -net nic -net tap,ifname=tap0 -nographic
运行结果如下
Qemu的默认登录密码应该是root/root
登录成功,这个时候可以看到qemu虚拟机的地址跟宿主机的地址在一个网段。
只要是这个网段的主机都可以跟qemu虚拟机通信,这为我们通过kali研究qemu虚拟机提供了便利。
接下来,我们回到kali主机上,将我们通过binwalk提取的目录squashfs-root打包上传到qemu虚拟机。
$ tar -czvf squash.tar squashfs-root
$ scp squash.tar root@192.168.232.134:/root/
报错了,虽然能够ping通,看来还是有点问题,直接ssh看一下。
嗯,同样的问题,回到宿主机访问一下试试看。
嗯,宿主机是可以的,这个问题后面再研究,先从宿主机上传一下上面准备好的tar包。
顺利上传成功,在qemu虚拟机中也找到了对应的包,进行解压。
# tar -zxvf squash.tar
进行文件挂载。
root@debian-mips:~# mount -o bind /dev ./squashfs-root/dev
root@debian-mips:~# mount -t proc /proc ./squashfs-root/proc/
然后启动shell
一切都比较顺利,接下来开启路由器的环境。
# ./bin/upnp
# ./bin/mic
最后感觉没有启动成功,web页面试了一下也进不去.
Ping一下试试看,发现网络也不通了,应该路由器启动以后,修改成了路由器本身默认的网络。
Ctrl+c退出,再看一下网络。
地址变成了192.168.1.1,这应该是路由器启动的时候更改的。
通过nmap扫描一把。
开放了ssh的22端口,telnet的23端口,syslog的514端口,看来路由器是起来了,只是启动可能有些问题。很大概率是我们提取的squashfs-root不够全面,导致固件仿真的时候有些文件找不到。
这是第一次使用Qemu进行仿真,还有很多内容没有搞明白,需要深入学习,后面会陆续更新。