0%

gdb常用指令

  1. backtrace 命令,简写 bt,用来查看当前进程的函数调用栈情况。

  2. list 命令,简写 l,回到栈列表,会将当前栈里的程序代码罗列出来,方便问题查找,需要有源码。

    • list 38 //查看38行附近10行代码
    • list 1,10 //查看1-10行
    • list main //查看main函数开始10行
  3. break 命令,简写 b,设置断点。

    • b *(0x123456) //常用,给 0x123456 地址处的指令下断点
      • b *rebase(0x123456)//rebase(0x123456) //rebase(0x123456)//rebase 在调试开PIE的程序的时候可以直接加上程序的随机地址
    • b fun_name //常用,给函数 fun_name下 断点,目标文件要保留符号才行
      • b file_name:fun_name
    • b file_name:15 //给 file_name 的 15 行下断点,要有源码才行
      • b 15
    • b +0x10 //在程序当前停住的位置下 0x10 的位置下断点,同样可以 -0x10,就是往前0x10
    • break fun if $rdi==5 //条件断点,rdi 值为 5 的时候断
  4. 查看、删除、禁用断点

    • 使用info break(简写: i b)来查看断点编号
    • delete 5 //常用,删除5号断点
    • disable 5 //常用,禁用5号断点
    • enable 5 //启用5号断点
    • clear //清除下面的所有断点
  5. 步入、步过、继续、运行

    • s //单步步入,遇到调用跟进函数中,相当于 step into,源码层面的一步
      • si //常用,同s,汇编层面的一步
    • n //单步补过,遇到电泳不跟进,相当于 step over,源码层面的一步
      • ni //常用,同n,汇编层面的一步
    • c //continue,常用,继续执行到断点,没断点就一直执行下去
    • r //run,常用,重新开始执行
  6. 回车键,将继续按照上条指令执行。

  7. print,简写 p,可打印表达式和变量的值,在 print 命令后追加 /format 可以格式化输出。/format 是一个 gdb 的格式化字符串,比较有用的格式化字符有 x:十进制数; c:字符; a:地址

    • p/x p/a p/b p/s …
    • p fun_name //打印fun_name的地址,需要保留符号
    • p 0x10-0x08 //计算0x10-0x08的结果
    • p &a //查看变量a的地址
    • p *(0x123456) //查看0x123456地址的值,注意和x指令的区别,x指令查看地址的值不用星号
    • p $rdi //显示rdi寄存器的值,注意和x的区别,这只是显示rdi的值,而不是rdi指向的值
      • p *($rdi) //显示rdi指向的值
  8. print-object,简写为 po,用来输出 obj-c 中的对象。它的工作原理是,向被调用的对象发送名为 debugDescription 的消息。它和常见的 description 消息很像。

  9. x 命令,格式:x/nuf address/$rdi 。nfu代表三个参数。

    • n代表显示几个单元(而不是显示几个字节,后面的u表示一个单元多少个字节),放在’/‘后面
    • u代表一个单元几个字节,b(一个字节),h(俩字节),w(四字节),g(八字节)
    • f代表显示数据的格式,f和u的顺序可以互换,也可以只有一个或者不带n,用的时候很灵活。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      f列表
      x 按十六进制格式显示变量。
      d 按十进制格式显示变量。
      u 按十六进制格式显示无符号整型。
      o 按八进制格式显示变量。
      t 按二进制格式显示变量。
      a 按十六进制格式显示变量。
      c 按字符格式显示变量。
      f 按浮点数格式显示变量。
      s 按字符串显示。
      b 按字符显示。
      i 显示汇编指令。
  10. set 命令,设置变量的值,set。

    • set $rdi=0x10 //把rdi寄存器的值变为0x10
    • set *(0x123456)=0x10 //0x123456地址的值变为0x10,注意带星号
    • set args “abc” “def” “gh“//给参数123赋值
      • set args “python -c ‘print “1234\x7f\xde”’” //使用python给参数赋值不可见字符
  11. info 命令,查看内存地址所在信息。

    • i b //常用,info break 查看所有断点信息(编号、断点位置)
    • i r //常用,info registers 查看各个寄存器当前的值
    • i f //info function 查看所有函数名,需保留符号
  12. show 命令:显示 GDB 相关信息。

    • show args //查看参数
  13. q,退出

  14. 内存断点指令watch:

    • watch 0x123456 //0x123456地址的数据改变的时候会断
    • watch a //变量a改变的时候会断
    • info watchpoints //查看watch断点信息
  15. 捕获断点catch:

    • atch syscall //syscall系统调用的时候断住
    • catch syscall //syscall系统调用的时候断住,只断一次
    • info break //catch的断点可以通过i b查看
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      除syscall外还可以使用的有:
      1)throw: 抛出异常
      2)catch: 捕获异常
      3)exec: exec被调用
      4)fork: fork被调用
      5)vfork: vfork被调用
      6)load: 加载动态库
      7)load libname: 加载名为libname的动态库
      8)unload: 卸载动态库
      9)unload libname: 卸载名为libname的动态库
      10)syscall [args]: 调用系统调用,args可以指定系统调用号,或者系统名称
  16. disass address 显示地址附近的汇编指令

  17. 查找数据

    • search rdi //从当前位置向后查包含rdi的指令,返回若干
    • search -h //查看search帮助
    • find “hello” //查找hello字符串,pwndbg独有
    • ropgadget //查找ropgadget,pwndbg独有
  18. 堆操作指令(pwndbg插件独有)

    • arena //显示arena的详细信息
      • arenas //显示所有arena的基本信息
      • arenainfo //好看的显示所有arena的信息
    • bins //常用,查看所有种类的堆块的链表情况
      • fastbins //单独查看fastbins的链表情况
      • largebins //同上,单独查看largebins的链表情况
      • smallbins //同上,单独查看smallbins的链表情况
      • unsortedbin //同上,单独查看unsortedbin链表情况
      • tcachebins //同上,单独查看tcachebins的链表情况
        • tcache //查看tcache详细信息
    • heap //数据结构的形式显示所有堆块
      • heapbase //查看堆起始地址
      • heapinfo、heapinfoall //显示堆的信息
      • parseheap //显示堆结构,很好用
    • tracemalloc //好用,会跟提示所有操作堆的地方
  19. cyclc num //生成 num 个用来溢出的字符

  20. $reabse //开启PIE的情况的地址偏移

    • b *$reabse(0x123456) //断住PIE状态下的二进制文件中0x123456的地方
    • codebase //打印PIE偏移,与rebase不同,这是打印,rebase是使用
  21. stack //查看栈

    • retaddr //打印包含返回地址的栈地址
  22. canary //直接看canary的值

  23. plt //查看plt表

  24. got //查看got表

  25. hexdump //像IDA那样显示数据,带字符串

参考链接