otool
报告具有PIE
标志的二进制文件。因此跳转必须相对于当前指令指针。但是,在Hopper中查看此PIE二进制文件的输出,我看到了绝对跳转,如下所示: br />
假设文本段已加载到
0x100000000
的标准虚拟地址处,那么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>
评论
介意附加相应的操作码吗?代表指令的十六进制。Hopper报告说,0x1000021e5处的指令编码为74 D9 @Megabeets。我看到根据英特尔参考,这对应于相对跳跃。我猜想那是Hopper只是将相对跳变转换为等效跳变以便于查看?