我可以跟踪调试器中的控制流吗?

时间:2018-12-21 07:04:12

标签: linux debugging gdb


通过在gdb中使用bt (backtrace)指令,
我们可以大致看到控制流经过的位置。

但是,仅当分支指令为call时可用。
(将返回地址保存在堆栈中。)

我很好奇我是否可以以类似方式跟踪jmp
如您所知,jmp不会保存寄信人地址...


我的情况:
更确切地说,在以下情况下我很麻烦。

0x9230  push   %ebx                     // Where %ebx comes from?
0x9231  mov    0x8(%esp),%eax

我想知道%ebx 值的来源。
某处 中,使用jmp将控制流切换到此处。
我想知道 某处 的位置。

问题:
有什么方法可以跟踪指令jmp吗?
  (或者我可以使用任何可能的应用程序吗?)

2 个答案:

答案 0 :(得分:0)

  

更确切地说,在以下情况下我很麻烦。
  0x9230 push %ebx // Where %ebx comes from?

在这种情况下,反向调试器可能最有用。

上次我尝试使用rr时,奇迹般地回答了“这是哪里来的?”问题。

在这里,您只需使用reverse-stepi,直到找到更新了%ebx的指令。

答案 1 :(得分:0)

如果问题仅在于直接的jmp系列(jmpjzjnz,...),则可以反汇编代码并检查哪个跳转指令来到那里。

最好的商用反汇编程序是IDA,它也具有内部调试器。但是让它变得棘手。但是其他反汇编程序通常也可以显示直接跳转引用,因此最好在Linux上尝试一个免费的跳转参考。

但是,如果您的跳转是间接的,例如jmp [eax],则需要通过调试找到它。据我所记得,诸如olydbg或X64dbg之类的Windows调试器在发生这种情况时可以显示间接跳转的来源,但这仅是Windows。