jmp $+5,为什么跳

逆向工程 拆卸 英特尔
2021-06-14 02:21:27

我正在查看一些代码,jmp $+5这些代码在库中的入口代码的开头指令,紧接着将寄存器推入堆栈。我知道jmp $+5将 IP 放在下一条指令中,但为什么会跳转到那里?没有它,无论如何都会执行下一条指令。唯一想到的是它与 PIE 相关,并以 0 的位移跳转,这可能是一个非零值,但这段代码是一个大“blob”的一部分,我不认为它的各个部分将是可重定位的,至少不能重定位到跳跃位移不为零的点。

编译器是 GCC 3.7?, linux 32 位

Version needs section '.gnu.version_r' contains 2 entries:
 Addr: 0x0000000000017e0c  Offset: 0x017e0c  Link: 3 (.dynstr)
  000000: Version: 1  File: libgcc_s.so.1  Cnt: 1
  0x0010:   Name: GCC_3.0  Flags: none  Version: 7

谢谢

1个回答

你确定你遇到了JMP $+5常见的 x86 函数序言模式CALL $+5位于您描述的位置。除了继续执行下一条指令外,还将下一条指令的地址压入堆栈。接下来通常是POP EBX将该地址放入 ebx 中,然后ADD EBX, $const修改 EBX 使其包含一个特定的参考地址,IIRC 是 GOT 中函数槽的开始。

这个指令序列的重要一点是它独立于代码的基地址工作,如JMP NEAR(操作码 E9)并CALL NEAR包含相对地址,所以 $+5 总是以相同的方式编码,无论指令位于何处。add 指令然后添加/减去该指令和 GOT 之间的固定距离。