pwn arm 环境——重型解决方案

Posted on May 1, 2021

写在一个月后:这个用法,说实话没什么用,建议不要这么想,光是虚拟机起一下要近十分钟就已经让人无法接受了,而且有各种各样鸡皮的问题,建议通过手动编译 qemu 来获得更好的调试体验。可以参考此文

国内的 CTF 比赛参加了两场,两次都是通过更换架构来增加难度,实在是很无力评价。通常的做法是用 qemu 虚拟,然后 gdb remote 上去调,可以参考这篇文章

但是 gdb-multiarch 的内存分析能力太弱等各种问题,再加上自己水平也比较低,对解题造成了极大影响,我觉得还是有必要到真机调试,但是我没有真机。于是这里考虑使用 qemu 的 system 模式装一台虚拟机出来,然后调试就应该会变得容易许多。

首先安装 qemu,到官网下载对应版本的安装包安装(如果使用的是 Linux 那么可以使用包管理器一键安装,但是由于我的物理机是 Windows,还是考虑在 Windows 下搭建)。

然后使用 qemu-img 创建映象,这里我选择分配 32G 空间(其实完全不用这么大,在配好调试环境之后也只占用了 2.2G,但是由于我是把映象存到U盘上的,所以大一点问题也不大)。

qemu-img create ubuntu16.04-arm64.img 32G

这里下载引导固件

用下面的命令安装

qemu-system-aarch64 -m 2048 -cpu cortex-a57 -M virt -bios QEMU_EFI.fd -nographic -drive if=none,file=ubuntu-16.04.7-server-arm64.iso,id=cdrom,media=cdrom -device virtio-scsi-device  -d evice scsi-cd,drive=cdrom -drive if=none,file=ubuntu16.04-arm64.img,id=hd0 -device virtio-blk-device,drive=hd0

其中 -cpu cortex-a57 是指定 CPU 类型,有如下选择

Supported guest CPU types:
cortex-a7 (32-bit)
cortex-a15 (32-bit; the default)
cortex-a53 (64-bit)
cortex-a57 (64-bit)
cortex-a72 (64-bit)
host (with KVM only)
max (same as host for KVM; best possible emulation with TCG)

-M 参数指定机器类型,可以用 qemu-system-aarch64 -machine help 查看支持的类型

敲下回车就可以起了

一路安装下去就可以了,这里要注意,如果和我一样使用 Windows 做宿主机安装的话,之后的安装界面很有可能充满乱码,基本不影响安装,但是在输入账号密码这些信息的时候,一定一定要先删光前面的乱码,否则你就不知道自己的用户名了。安装完成后会重启,这个时候基本不会有特别的问题。进入系统后大致看看就可以关机了(sudo poweroff)。

之后开机可以使用

qemu-system-aarch64 -m 2048 -cpu cortex-a57 -M virt -bios QEMU_EFI.fd -nographic -drive if=none,file=ubuntu16.04-arm64.img,id=hd0 -device virtio-blk-device,drive=hd0

此时会碰到

输入 exit,进入 UEFI 管理界面

一路这样选下去,进入这个 NO VOLUME LABEL 后就可以看到一个 EFI 文件夹,一路选下去就可以

选择这个,回车一敲就起了。

这样就完成了系统的安装,之后搭建调试环境和 x86_64 下没什么区别。

不过要注意换源要换到 arm 架构的源上,比如如下

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-security main restricted universe multiverse

# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-proposed main restricted universe multiverse

然后就是由于 qemu 也是一个用户态的进程,按一下 ctrl-C 就会直接把整台虚拟机结束掉,一不留神就会关机,而此虚拟机的启动又十分的慢,所以有必要做一个 ssh 服务。但是 qemu 的网络配置比较麻烦,我还不知道怎么实现通信,只能暂时在虚拟机里调了,效果其实也还是不错的。

这种方法非常的笨重,而且 qemu 的性能损耗也比较大,这也算是无奈之举吧。

主要参考此文,很好地解决了问题。