我正在使用Hopper,正在查看反汇编的otool报告具有PIE标志的二进制文件。因此跳转必须相对于当前指令指针。

但是,在Hopper中查看此PIE二进制文件的输出,我看到了绝对跳转,如下所示: br />
假设文本段已加载到0x100000000的标准虚拟地址处,那么Hopper只是将相对跳转转换为绝对跳转吗?还是我缺少关于位置独立可执行文件如何工作的概念上的东西? >

评论

介意附加相应的操作码吗?代表指令的十六进制。

Hopper报告说,0x1000021e5处的指令编码为74 D9 @Megabeets。我看到根据英特尔参考,这对应于相对跳跃。我猜想那是Hopper只是将相对跳变转换为等效跳变以便于查看?

#1 楼

如您的评论中所述,与je 0x1000021c0对应的操作码为74 D9。因此,毫无疑问,您正面临一个相对的JMP。 Hopper正在翻译相对的JMP,因此反向工程师无需计算地址就能更轻松地理解代码流。

我将通过一个使用radare2的简单示例演示Hopper的工作(尽管您可以使用自己喜欢的工具来做同样的事情。)首先,我们将在rwx权限中分配10000个空字节来打开radare2,以便在其中使用“沙盒”:

$ r2 malloc://10000


由于我们的基本地址是0x00000000,我们将寻求(转到)0x000021e5,这样我们就可以更容易地看到相对跳转:

[0x00000000]> s 0x21e5
[0x000021e5]>


看看我们当前的地址如何更改为0x21e5?好!

现在,让我们在当前地址中写入十六进制字节(74 d9):

[0x000021e5]> wx 74d9


并在该地址中反汇编一条指令: br />
[0x000021e5]> pd 1
        ╰─< 0x000021e5      74d9           je 0x21c0


如您所见,radele2和Hopper一样将地址0x????21e5的跳转转换为je 0x????21c0

#2 楼

好甜菜快了
这是在windbg中检查它的方法

0:000> ? .
Evaluate expression: 1999570342 = 772f05a6
0:000> EB . 74 D9
0:000> U . L1
ntdll!LdrpDoDebuggerBreak+0x2c:
772f05a6 74d9            je      ntdll!LdrpDoDebuggerBreak+0x7 (772f0581)
0:000> ? 772F0581 - .
Evaluate expression: -37 = ffffffdb
0:000> ? 21E5-21C0
Evaluate expression: 37 = 00000025
0:000>