为什么ida和gdb之间的偏移量存在差异?

逆向工程 艾达 数据库
2021-06-13 07:59:31

一个 PIE 二进制文件,当加载到 IDA 中时,对于位于in (gdb) 和(in IDA) 的指令,显示的偏移量 ( 0x202010) 与 gdb ( 0x2013a1)不同我该如何解释这种差异?0x555555554c680xc68

在此处输入图片说明 在此处输入图片说明

2个回答

对于“Position Independent Executable”二进制文件,加载器可以自由地使用某个基地址重新定位二进制文​​件。在 GDB 的情况下,二进制已经映射到内存中,0x2013a1内存操作数中的偏移量相对于当前RIP(即下一条指令的地址)计算的。当前指令大小是0x6f - 0x68 = 0x7字节,所以考虑到当前指令的地址,我们有一个偏移量:

0x2013a1 + 0x7 = 0x2013a8

在 的情况下IDA,您看到“静态”虚拟地址,0x202010内存操作数中的偏移量与代码段的基地址相对计算的,因此在考虑当前指令的地址时,我们有一个偏移量:

0x202010 - 0xc68 = 0x2013a8

这些值在两种情况下都是一致的。

IDA 显示了一个简化的操作数,其rip+<delta>值已解析,因此您不必自己计算。如果您愿意,可以通过在特定于处理器的选项中启用“显式 RIP 寻址”来查看 rip 相关指令的原始形式。