通过在gdb中使用bt (backtrace)
指令,
我们可以大致看到控制流经过的位置。
但是,仅当分支指令为call
时可用。
(将返回地址保存在堆栈中。)
我很好奇我是否可以以类似方式跟踪jmp
。
如您所知,jmp
不会保存寄信人地址...
我的情况:
更确切地说,在以下情况下我很麻烦。
0x9230 push %ebx // Where %ebx comes from?
0x9231 mov 0x8(%esp),%eax
我想知道%ebx 值的来源。
在 某处 中,使用jmp
将控制流切换到此处。
我想知道 某处 的位置。
问题:
有什么方法可以跟踪指令jmp吗?
(或者我可以使用任何可能的应用程序吗?)
答案 0 :(得分:0)
更确切地说,在以下情况下我很麻烦。
0x9230 push %ebx // Where %ebx comes from?
在这种情况下,反向调试器可能最有用。
上次我尝试使用rr时,奇迹般地回答了“这是哪里来的?”问题。
在这里,您只需使用reverse-stepi
,直到找到更新了%ebx
的指令。
答案 1 :(得分:0)
如果问题仅在于直接的jmp
系列(jmp
,jz
,jnz
,...),则可以反汇编代码并检查哪个跳转指令来到那里。
最好的商用反汇编程序是IDA,它也具有内部调试器。但是让它变得棘手。但是其他反汇编程序通常也可以显示直接跳转引用,因此最好在Linux上尝试一个免费的跳转参考。
但是,如果您的跳转是间接的,例如jmp [eax]
,则需要通过调试找到它。据我所记得,诸如olydbg或X64dbg之类的Windows调试器在发生这种情况时可以显示间接跳转的来源,但这仅是Windows。