我正在尝试分析核心转储。核心上的堆栈帧很少,所以我使用的是反汇编程序。现在,反汇编程序列出了汇编指令。现在我想检查特定寄存器的值是多少。由于同一个寄存器被多次使用,我认为我试图访问的值是最后一个当前值。那么,有没有办法可以转到特定指令然后检查寄存器值?
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”的值;我怎么检查?我无法运行该程序,因为它只是客户的核心文件。
答案 0 :(得分:1)
由于同一个寄存器被多次使用,我认为我试图访问的值是最后一个值。
使用寄存器不会改变它的值,只能写入它。
如果寄存器被多次写入,则是:您将在核心转储中看到写入的最后一个值。
那么,有没有办法可以转到特定指令然后检查寄存器值?
您要求的是reverse debugging。虽然可以做到,但它带来了非常大的开销(内存和执行速度)。 A&#34;正常&#34;核心转储肯定没有执行反向调试的信息。
我想查看寄存器的值&#34; rbp&#34;在地址为0x00007fbb3cc51ac2的指令处;我怎么检查?
这相对容易:因为%rbp
只存储一次(0x7fbb3cc51a9d
处的指令),所以该值应该与函数中任何其他位置的值相同。
注意:这假设您调用的每个函数都保存并恢复了%rbp
的值(这是ABI要求的)。其中一个例程可能是错误的并且没有正确恢复该值,在这种情况下,您大部分都是搞砸了。但是,您还应该能够从%rbp
恢复%rsp
的值:0x7fbb3cc51a9d
后它们相等,然后%rsp
减去0x10
0x7fbb3cc51aa0
。所以必须是%rbp == %rsp + 0x10
。