自從上一次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支持的鏡像。
三 對下載的鏡像進行擴容
默認情況下,這個文件系統鏡像能使用的大小為2G。
我就對這個文件系統進行擴容。
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 對其進行分區調整
刪除/dev/nbd0p1分區
重建/dev/nbd0p1分區
使其可引導
使文件系統適應擴展后的鏡像。
四 提取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系統。可以使用如下的命令啟動:
第二種方式就是橋接的方式,Guest和Host能相互方便訪問,需要Host的root權限。在運行qemu-system-aarch64前需要生成網橋,可使用下面的腳本:
腳本運行之后,運行ifconfig看下
然后使用下面的腳本來啟動qemu-system-aarch64
啟動后,安裝GCC/GDB,開始調試吧!!!
在退出qemu后,運行下面腳本來恢復原有的網絡設置
六 其他
我一般會在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
https://wiki.ubuntu.com/ARM64/QEMU
http://blog.eciton.net/uefi/qemu-arm-uefi.html