ARM64调试环境

时间:2024-10-30 14:05:08

自从上一次ZCTF做了一道ARM64的逆向题目后,我决定记录下利用qemu搭建ARM64的环境的过程,以后肯定会遇到更多ARM平台下的Reverse和PWN。

一 安装QEMU

我要模拟的是64位的ARM环境,所以需要使用的是qemu-system-aarch64。在kali下,使用apt-get install qemu-system-aarch64就可以安装成功。

二 可以直接使用的QEMU镜像

Ubuntu为用户已经提供了已经安装好系统的文件系统镜像。在

https://cloud-images.ubuntu.com/ 里可以找到各个ubuntu server版本的QEMU镜像,我在这里使用了Ubuntu Server 14.04。后缀是disk1.img就是qemu支持的镜像。

ARM64调试环境

三 对下载的镜像进行扩容

默认情况下,这个文件系统镜像能使用的大小为2G。

ARM64调试环境

我就对这个文件系统进行扩容。

qemu-img resize trusty-server-cloudimg-arm64-disk1.img 20G 将镜像的容量扩展为20G

modprobe nbd max_part=8

qemu-nbd -c /dev/nbd0 trusty-server-cloudimg-arm64-disk1.img 使用qemu-nbd挂载该镜像

fdisk /dev/nbd0 对其进行分区调整

ARM64调试环境

删除/dev/nbd0p1分区

ARM64调试环境

重建/dev/nbd0p1分区

ARM64调试环境

使其可引导

ARM64调试环境

使文件系统适应扩展后的镜像。

ARM64调试环境

四 提取vmlinuz和intrid.img

mkdir mnt

mount /dev/nbd0p1 mnt

ls -lt mnt/

cp mnt/boot/vmlinuz-3.19.0-25-generic .

cp mnt/boot/initrd.img-3.19.0-25-generic .

umount mnt

qemu-nbd -d /dev/nbd0

五 万事俱备 启动系统

Qemu的网络可以有多种方式,我对两种常用的方式进行介绍。

为了QEMU的Guest系统使用网络,QEMU需要为Guest准备虚拟的网络设备(比如网卡),还要为每一个虚拟的网络设备准备一个backend,backend负责与虚拟的网络设备进行交互,比如将Guest系统产生的网络流量从虚拟的网络设备中取出放入Host系统的网络中。每一个backend要和一个虚拟的网络设备进行关联。在系统的启动时,需要指定下面两行参数。

-netdev TYPE,id=NAME,...

-device TYPE,netdev=NAME

第一种使用网络的方式类似于Nat的方式,Guest系统可以进行网络访问,但是Host系统不能直接访问Guest系统。可以使用如下的命令启动:

ARM64调试环境

  第二种方式就是桥接的方式,Guest和Host能相互方便访问,需要Host的root权限。在运行qemu-system-aarch64前需要生成网桥,可使用下面的脚本:

ARM64调试环境

脚本运行之后,运行ifconfig看下

ARM64调试环境

然后使用下面的脚本来启动qemu-system-aarch64

ARM64调试环境

启动后,安装GCC/GDB,开始调试吧!!!

在退出qemu后,运行下面脚本来恢复原有的网络设置

ARM64调试环境

六 其他

我一般会在screen会话里运行qemu,然而退出qemu的快捷键是:Ctrl + a + x。但是这个快捷键的按下会被screen给捕捉到,所以不会到达qemu,那么qemu就不会退出。可以使用下面的命令来退出qemu。其中,arm64是screen的会话名称。

screen -S arm64 -p 0 -X stuff "^ax"

七 参考文献

http://rzycki.blogspot.com/2014/08/using-qemu-to-run-ubuntu-arm-64-bit.html

https://en.wikibooks.org/wiki/QEMU/Networking

http://www.mztn.org/dragon/arm64_01.html

http://www.cnblogs.com/clpszpp/p/linux_bridge.html

https://gist.github.com/larsks/3933980

http://hzqtc.github.io/2012/02/kvm-network-bridging.html

http://suihkulokki.blogspot.my/2014/08/testing-qemu-21-arm64-support.html

https://gist.github.com/philipz/3d278f414f8eadb5afe1

https://en.wikibooks.org/wiki/QEMU/Images

http://askubuntu.com/questions/456491/what-are-the-different-ubuntu-cloud-guest-images-disk1-root-uefi1

https://wiki.ubuntu.com/ARM64/QEMU

http://blog.eciton.net/uefi/qemu-arm-uefi.html