如何在gdb的核心中按反汇编程序显示的指令进行指令

时间:2016-05-13 06:02:55

标签: debugging gdb disassembly

我正在尝试分析核心转储。核心上的堆栈帧很少,所以我使用的是反汇编程序。现在,反汇编程序列出了汇编指令。现在我想检查特定寄存器的值是多少。由于同一个寄存器被多次使用,我认为我试图访问的值是最后一个当前值。那么,有没有办法可以转到特定指令然后检查寄存器值?

实施例

gdb binary core
disas /s fucntion_name
   0x00007fbb3cc51a9c <+0>:     push   %rbp
   0x00007fbb3cc51a9d <+1>:     mov    %rsp,%rbp
   0x00007fbb3cc51aa0:  sub    $0x10,%rsp
   0x00007fbb3cc51aa4:  mov    %rdi,-0x8(%rbp)
   0x00007fbb3cc51aa8:  cmpq   $0x0,-0x8(%rbp)
   0x00007fbb3cc51aad:  je     0x7fbb3cc51b0b
   0x00007fbb3cc51aaf:  mov    0x2030c3(%rip),%eax 
   0x00007fbb3cc51ab5:  test   %eax,%eax
   0x00007fbb3cc51ab7:  je     0x7fbb3cc51b0b
   0x00007fbb3cc51ab9:  mov    -0x8(%rbp),%rdi
   0x00007fbb3cc51abd:  callq  0x7fbb3caf8df0 
   0x00007fbb3cc51ac2:  mov    -0x8(%rbp),%rax
   0x00007fbb3cc51ac6:  mov    0x28(%rax),%eax
   0x00007fbb3cc51ac9:  lea    -0x1(%rax),%edx
   0x00007fbb3cc51acc:  mov    -0x8(%rbp),%rax
   0x00007fbb3cc51ad0:  mov    %edx,0x28(%rax)
   0x00007fbb3cc51ad3:  mov    -0x8(%rbp),%rax
   0x00007fbb3cc51ad7:  mov    0x28(%rax),%eax
   0x00007fbb3cc51ada:  test   %eax,%eax
   0x00007fbb3cc51adc:  jne    0x7fbb3cc51b02
   0x00007fbb3cc51ade:  mov    -0x8(%rbp),%rax
   0x00007fbb3cc51ae2:  mov    0x2c(%rax),%eax

现在,假设我想在地址为0x00007fbb3cc51ac2的指令中检查寄存器“rbp”的值;我怎么检查?我无法运行该程序,因为它只是客户的核心文件。

1 个答案:

答案 0 :(得分:1)

  

由于同一个寄存器被多次使用,我认为我试图访问的值是最后一个值。

使用寄存器不会改变它的值,只能写入它。

如果寄存器被多次写入,则是:您将在核心转储中看到写入的最后一个值。

  

那么,有没有办法可以转到特定指令然后检查寄存器值?

您要求的是reverse debugging。虽然可以做到,但它带来了非常大的开销(内存和执行速度)。 A&#34;正常&#34;核心转储肯定没有执行反向调试的信息。

  

我想查看寄存器的值&#34; rbp&#34;在地址为0x00007fbb3cc51ac2的指令处;我怎么检查?

这相对容易:因为%rbp只存储一次(0x7fbb3cc51a9d处的指令),所以该值应该与函数中任何其他位置的值相同。

注意:这假设您调​​用的每个函数都保存并恢复了%rbp的值(这是ABI要求的)。其中一个例程可能是错误的并且没有正确恢复该值,在这种情况下,您大部分都是搞砸了。但是,您还应该能够从%rbp恢复%rsp的值:0x7fbb3cc51a9d后它们相等,然后%rsp减去0x10 0x7fbb3cc51aa0。所以必须是%rbp == %rsp + 0x10