这篇文章主要是说如何用qemu+gdb在本机上调试arm架构的程序,主要参考这篇文章:ARM pwn 环境搭建和使用,以及介绍gdb的一些使用。
需要用到的工具
- qemu-user
- gdb-multiarch
qemu+gdb调试
第一步,使用qemu启动需要调试的程序,
1 | qemu-arm -L /usr/arm-linux-gnueabi -g1234 a.out |
我这里假设是arm架构的程序,用qemu-arm
启动,-L
跟的是对应架构的动态链接库所处的根目录,-g
后面跟的是gdb调试用的端口号,a.out
就是要调试的程序。
第二步,运行gdb-multiarch
1 | gdb-multiarch -q a.out |
-q
参数是可选的,安静模式不显示gdb版本信息,a.out
就是要调试的程序,用于读取符号信息。
第三步,在gdb控制台设置架构
1 | set architecture arm |
我这里是用于调试arm架构的程序,可以根据需要修改
第四步,连接qemu远程调试
1 | target remote localhost:1234 |
由于我qemu和gdb都运行在本机上,所以ip使用localhost,1234是之前qemu指定的端口号,可以根据情况自己修改
至此已经可以进行调试了
gdb常用命令
我主要参考了这篇文章:GDB常用命令,也可以自行在gdb内输入help all
查看全部命令。
一些小提示,按tab键可以补全命令,部分常用命令都有缩写,以及补充一些汇编相关的命令和文章中没有提到但是我用到的
- si/ni,单汇编指令调试,si是会进入跳转到函数内部,ni不会进入指令内部
- p $寄存器名称,可以查看寄存器以及给寄存器赋值
- b *汇编地址,可以在指定地址打断点
- 有时候gdb不会自动加载动态库的符号表,可以用
file xxx.so
手动加载动态库的符号表 info function
可以查看加载的所有函数名,用于打断点。- 可以把一些每次调试都要执行的gdb指令写在一个文本文件里面,下一次打开的时候用
source xxx
来执行。
IDA Pro或Ghidra使用gdb远程调试
这两个都研究了一下,Ghidra远程调试的教程几乎没有,我也不知道为什么连不上。IDA Pro能连接上,但是不会使用,感觉不如在终端使用gdb顺手。先开坑,后续再补上。