gdb查看当前汇编指令

0x00 前言

在没有源码的情况下,查看汇编指令

0x01 gdb 命令

方法1. display

查看当前执行及后20行汇编指令

(gdb) display /20i $pc

方法2. layout

使用gdb的TUI模式,调出汇编指令窗口配合调试。

(gdb) layout asm

效果如下

   ┌───────────────────────────────────────────────────────────────────────────┐
   │0x7ffff740d756 <__libc_start_main+214>  mov    0x39670b(%rip),%rax        #│
   │0x7ffff740d75d <__libc_start_main+221>  mov    0x8(%rsp),%rsi              │
   │0x7ffff740d762 <__libc_start_main+226>  mov    0x14(%rsp),%edi             │
   │0x7ffff740d766 <__libc_start_main+230>  mov    (%rax),%rdx                 │
   │0x7ffff740d769 <__libc_start_main+233>  callq  *0x18(%rsp)>│0x7ffff740d76d <__libc_start_main+237>  mov    %eax,%edi                   │
   │0x7ffff740d76f <__libc_start_main+239>  callq  0x7ffff7427970 <exit>       │
   │0x7ffff740d774 <__libc_start_main+244>  xor    %edx,%edx                   │
   │0x7ffff740d776 <__libc_start_main+246>  jmpq   0x7ffff740d6b9 <__libc_start│
   │0x7ffff740d77b <__libc_start_main+251>  mov    0x39ca2e(%rip),%rax        #│
   │0x7ffff740d782 <__libc_start_main+258>  ror    $0x11,%rax                  │
   │0x7ffff740d786 <__libc_start_main+262>  xor    %fs:0x30,%rax               │
   │0x7ffff740d78f <__libc_start_main+271>  callq  *%rax                       │
   └───────────────────────────────────────────────────────────────────────────┘
multi-thre process 3718 In: __libc_start_main     Line: ??   PC: 0x7ffff740d76d
#3  0x00007ffff7466eb5 in _IO_do_write () from /lib/x86_64-linux-gnu/libc.so.6
#4  0x00007ffff74671ff in _IO_file_overflow ()
   from /lib/x86_64-linux-gnu/libc.so.6
#5  0x0000000000408756 in ?? ()
#6  0x0000000000403980 in ?? ()
#7  0x00007ffff740d76d in __libc_start_main ()
   from /lib/x86_64-linux-gnu/libc.so.6
(gdb)

个人感觉没有gdb-peda好用,但是江湖救急还是不错的。

方法3. layout增强版

先执行layout split 再执行layout asm, 这样便可以上下滚动,当然,有时后只按键也会卡住,需要配合键效果更佳。

0x02 缺陷

如何查看当前汇编前面的内容?

使用方法1,可以直接计算$pc的绝对地址,并减去n,即可向前查看。然而,这个n不是任意值,如果不正确,对于变长的汇编指令集来说会显示错误的汇编指令。

使用方法2, 不能向前滚动。针对这个问题,我们可以使用衍生的方法3。

0x03 Tips

  1. gdb的TUI模式类似screen,退出使用 Ctrl -x a
  2. TUI模式查看寄存器的命令为: layout regs
  3. display /10i $pc的方法与x /10i $pc在打印汇编上是同义的

0x04 参考文献

https://stackoverflow.com/questions/1902901/show-current-assembly-instruction-in-gdb
https://stackoverflow.com/questions/26572805/gdb-tui-scroll-assembly-view-above-current-instruction

你可能感兴趣的:(gdb)