gdb常用调试命令总结

By xia0

0x01 序

最近在做TCTF上一道Linux下的逆向题,对GDB的调试很多命令相关做一个小总结,可能不是很系统,只是记一些比较常用的,后面可能会不定期更新。

0x02 命令行参数

有时候,我们需要调试的程序需要有命令行参数,很多朋友都不知道怎么设置调试的程序的命令行参数。其实,有两种方法:

  1. gdb命令行的 –args 参数
  2. gdb环境中 set args命令
  3. show args查看程序参数

0x03 多线程调试

多线程调试可能是问得最多的。其实,重要就是下面几个命令:

info thread 查看当前进程的线程。
thread 切换调试的线程为指定ID的线程。
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...................|