#0x01 序
最近在做TCTF上一道Linux下的逆向题,对GDB的调试很多命令相关做一个小总结,可能不是很系统,只是记一些比较常用的,后面可能会不定期更新。
#0x02 命令行参数
有时候,我们需要调试的程序需要有命令行参数,很多朋友都不知道怎么设置调试的程序的命令行参数。其实,有两种方法:
- gdb命令行的 –args 参数
- gdb环境中 set args命令
- show args查看程序参数
#0x03 多线程调试
多线程调试可能是问得最多的。其实,重要就是下面几个命令:
info thread 查看当前进程的线程。
thread
break file.c:100 thread all 在file.c文件第100行处为所有经过这里的线程设置断点。
set scheduler-locking off|on|step,这个是问得最多的。在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。
- off 不锁定任何线程,也就是所有线程都执行,这是默认值。
- on 只有当前被调试程序会执行。
- step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。
#0x04 断点
- break *0x000000 下断点
- info breakpoints 查看断点
- delete break 1 删除断点
- break [where] if [condition] 条件断点
- enable 恢复失效的断点
- disable 使断点失效
- clear 清除断点
- break 21 在第21行设置断点
- break main 在main函数处设置断点
- break test 在函数test处设置断点
#0x05 x命令
也许,你很喜欢用p命令。所以,当你不知道变量名的时候,你可能会手足无措,因为p命令总是需要一个变量名的。x命令是用来查看内存的,在gdb中 “help x” 你可以查看其帮助。
- x/x 以十六进制输出
- x/d 以十进制输出
- x/c 以单字符输出
- x/i 反汇编 – 通常,我们会使用 x/10i $ip-20 来查看当前的汇编($ip是指令寄存器)
- x/s 以字符串输出
- x/5i $pc 查看汇编代码
- x/4wx 0x000000 查看内存
#0x06 command命令
有一些朋友问我如何自动化调试。这里向大家介绍command命令,简单的理解一下,其就是把一组gdb的命令打包,有点像字处理软件的“宏”。下面是一个示例:
(gdb) break func
Breakpoint 1 at 0x3475678: file test.c, line 12.
(gdb) command 1
Type commands for when breakpoint 1 is hit, one per line.
End with a line saying just "end".
>print arg1
>print arg2
>print arg3
>end
(gdb)
当我们的断点到达时,自动执行command中的三个命令,把func的三个参数值打出来。
#0x07 其他
- step / s 下一步,直接执行下一条程序
set disassembly-flavor intel 设置为intel汇编指令
- info proc mappings
- `define stop-hook 设置断点触发后自动执行命令
info registers
x/24wx $esp
x/2i $eip
end` - continue / cont 下一段,如果遇到函数,不会进入函数,逐过程,有点类似VS里面的F10
- run 运行
- finish 结束调试
- print / p 显示某个变量的值
- p *array@len 输出数组
- p i 输出i的值
#0x08 附表
寄存器宽度表
|63..32|31..16|15-8|7-0|
|AH.|AL.|
|AX.....|
|EAX............|
|RAX...................|