1.下载gdb-multiarch
sudo apt-get install gdb-multiarch
2.下载qemu模拟器
qemu是一款可执行硬件虚拟化的虚拟机,与他类似的还有Bochs、PearPC,
但qemu具有高速(配合KVM)、跨平台的特性
qemu主要有两种运行模式:qemu-user 和 qemu-system
但是这里我们只用下载qemu-user
就行了:
sudo apt update
sudo apt install qemu
sudo apt-get install qemu-user
sudo apt-get install qemu-user-binfmt
sudo apt-get install "binfmt*"
到这里了,我们就能直接运行静态链接arm的程序了,拿的typo试试:
3.对于动态链接的文件
##搜索libc
sudo apt search "libc6" | grep arm
##安装libc
sudo apt install libc6-dbg-arm64-cross
在其中寻找所需的架构对应的库,比如arm32用的是这个:
apt install libc6-armel-cross
安装完后,在/usr
目录下会出现arm-linux-gnueabi
这个文件夹,该文件夹即对应刚安装好的arm32位libc库.
对应的64位如下:
apt install libc6-dbg-arm64-cross
安装完后,在/usr
目录下会出现aarch64-linux-gnu
这个文件夹,该文件夹即对应刚安装好的arm64位libc库:
之后我们使用下面的命令指定arm程序的动态链接器,即可运行程序:
64位:
qemu-aarch64 -g 12345 -L /usr/aarch64-linux-gnu/ xxx
-g 代表为程序运行分配的进程端口号,一般用于gdb调试时开启,不填时系统自动分配
-L 代表动态链接库的文件夹地址,静态链接程序可以不需要
xxx 代表要运行的arm文件地址
32位:
qemu-arm -g 12345 -L /usr/arm-linux-gnueabi xxx
gdb调试
之前我们已经安装完了gdb-multiarch,现在来试试怎么调试程序。
- 首先开一个终端,使用qemu启动arm程序,并且分配一个端口:
qemu-aarch64 -g 12345 -L /usr/aarch64-linux-gnu/ xxx
- 另外一个终端,打开gdb-multiarch
sudo gdb-multiarch # 打开gdb-multiarch
pwndbg> set architecture aarch64 # 设置64位arm的环境
The target architecture is assumed to be aarch64
pwndbg> target remote localhost:12345 # 注意这里的端口要和你的一样
例子:调试32位的静态程序
- 启动程序:静态链接的程序就不需要-L制定动态链接库了。
- 打开gdb-multiarch
如果是想在exp中调试
在pwntools中,我们可以使用如下代码来动态调试程序:
p = process(["qemu-aarch64", "-g", "12345","-L","/usr/aarch64-linux-gnu/", "xxx"])
# 32arm只需要替换指令为qemu-arm,并更换对应的动态链接库