六、QEMU+MIPS环境搭建(下)
QEMU System模式的使用
上一次我们分享的是QEMU User模式的使用方法,使用User模式的QEMU,确实可以满足大多数的模拟运行场景,但它也确实存在很多硬伤。
比如QEMU的User模式并不能完整的模拟mips-linux的内核环境,导致一些应用程序需要严重依赖比如/proc目录下或/sys目录下的内存文件,而这些文件一般都是Linux内核在启动时产生的,甚至有些文件只有在真正的mips-linux操作系统中才存在,或者只有在真正的mips-linux系统中的这些文件才真正有参考意义。
又比如在路由器固件逆向分析过程中,特别是在ShellCode开发时,你可能写了一段汇编代码,编译后你发现它不能正常工作,那你就需要进行调试,而在Ubuntu虚拟机中目前又不存在能直接使用的mips-linux调试器,所以这样的调试环境搭建工作也会花费你很大精力。
所以,最好的办法就是使用QEMU的System模式运行一个mips架构的Debian系统,然后在这个mips架构的Debian系统中开发ShellCode并进行调试。
同样的,书中使用的mips-debian系统也很老旧了,导致系统启动后在线安装一些编译器、调试器之类的软件都不行。后来,我在网上搜到了一篇关于如何使用qemu启动debian 9系统的文章(https://markuta.com/how-to-build-a-mips-qemu-image-on-debian/),这里我也进行了总结:
mips-debian 9的系统目前只支持在线安装,首先应该去debian的ftp站点上(http://ftp.debian.org/debian/dists/stable/main/installer-mips/current/images/malta/netboot/)下载启动盘:
$ wget http://ftp.debian.org/debian/dists/stable/main/installer-mips/current/images/malta/netboot/initrd.gz
$ wget http://ftp.debian.org/debian/dists/stable/main/installer-mips/current/images/malta/netboot/vmlinux-4.9.0-9-4kc-malta
如果出现404错误,可以网页打开文件所在目录,查看正确vmlinux来下载:
http://ftp.debian.org/debian/dists/stable/main/installer-mips/current/images/malta/netboot/
然后使用命令为mips-debian创建一个2G大小的模拟磁盘文件:
$ qemu-img create -f qcow2 hda.img 2G
然后就可以执行mips-debian系统的安装了:
$ qemu-system-mips -M malta \
-m 512 -hda hda.img \
-kernel vmlinux-4.9.0-9-4kc-malta \
-initrd initrd.gz \
-append "console=ttyS0 nokaslr" \
-nographic
安装过程中会提示语言选择:
地理位置选择:
主机名配置:
域名配置:
软件镜像源所在位置:
网络代理设置:
这些配置一般选择默认值即可,如果默认值是空的,那就保持它为空。
稍后还会提示你设置root用户的密码:
然后设置普通用户的用户名:
普通用户的密码:
时区选择:
磁盘分区:
最后进行分区配置的确认:
确认无误后,选择“Yes”选项,就真正开始了系统安装过程:
经过大概1个小时左右(当然,这取决于你为qemu指定了多大的内存和你所在的网络情况),会提示安装一些方便开发用的工具,其中最重要的是SSH server:
最终,整个系统安装完成:
但,似乎并没有这么顺利,因为这里提示说找不到boot分区,所以,可能无法启动系统。没关系,先选择“Continue”继续:
此处需要选择“Go Back”选项,并在页面中选择“Execute Shell”选项,然后在给出的shell中输入“poweroff命令”。
因为在刚刚系统安装过程的末尾给出提示指出,mips-debian系统还需要boot分区才能够正常引导,所以下一步我们需要从hda.img磁盘镜像文件中提取boot分区镜像:
1、挂载hda.img磁盘镜像文件:
sudo modprobe nbd max_part=63
sudo qemu-nbd -c /dev/nbd0 hda.img
sudo mount /dev/nbd0p1 /mnt
2、从挂载目录中拷贝boot分区中的重要文件:
cp -r /mnt/boot/initrd.img-4.9.0-9-4kc-malta .
cp -r /mnt/boot .
3、卸载工作
sudo umount /mnt
sudo qemu-nbd -d /dev/nbd0
MIPS-Debian系统网络配置
sudo apt-get install uml-utilities bridge-utils
修改/etc/network/interfaces:
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
auto ens33
iface ens33 inet dhcp
#auto br0
iface br0 inet dhcp
bridge_ports ens33
bridge_maxwait 0
修改/etc/qemu-ifup:
sudo /sbin/ifconfig $1 0.0.0.0 promisc up
sudo /sbin/brctl addif br0 $1
sleep 2
启动br0网卡:
$ sudo chmod a+x /etc/qemu-ifup
$ sudo /etc/init.d/networking restart
$ sudo ifdown ens33
$ sudo ifup br0
启动虚拟机:
$ sudo qemu-system-mips -M malta -m 512 -hda hda.img -kernel vmlinux-4.9.0-9-4kc-malta -initrd initrd.img-4.9.0-9-4kc-malta -append "root=/dev/sda1 console=ttyS0 nokaslr" -net nic,macaddr=00:16:3e:00:00:02 -net tap -nographic
使用上面的步骤启动mips-debian系统后,mips-debian系统就能够共享Ubuntu虚拟机的网络连接了:
在MIPS-Debian系统安装完成以后,我们就可以在上面安装gcc、gdb、gdbserver等一些常用的开发和调试工具了,然后我们就可以在上面方便的开发和调试ShellCode了。
这一小节我们主要讲解了在什么情况下需要用到QEMU的System模式,并给出了MIPS-Debian系统的环境搭建步骤。
最后,希望本节的内容能够为你带来帮助。
下次我们将分享如何使用IDA对MIPS-Linux程序进行静态分析和动态调试的内容。
谢谢大家。
下一篇: 数的计算---递推(找规律)
推荐阅读
-
centos 6.3 最小安装系统下快速搭建环境步骤分享
-
64位CentOS 6.0下搭建LAMP环境详细步骤
-
Windows下搭建PHP开发环境(Apache+PHP+MySQL)
-
CentOS6环境下搭建路由器的方法
-
CentOS下RabbitMq高可用集群环境搭建教程
-
Docker下搭建一个JAVA Tomcat运行环境的方法
-
在Linux虚拟环境下搭建DB2的多分区数据库DPF
-
Linux+php+apache+oracle环境搭建之CentOS下安装Oracle数据库
-
centos下GitLab+Jenkins持续集成环境搭建(安装jenkins)
-
再整理:Visual Studio Code(vscode)下的通用C语言环境搭建