为什么GDB和Objdump的指令地址相同?

时间:2018-05-29 23:40:20

标签: c assembly gdb reverse-engineering objdump

我正在深入了解逆向工程,这非常有趣。

我有一个问题:为什么我从 GDB Objdump 获得的说明地址是相同的?

每次不应该将二进制文件加载到不同的地址吗?

谢谢。 于连

1 个答案:

答案 0 :(得分:2)

GDB默认禁用ASLR。如果你set disable-randomization off,那么PIE可执行文件(Position Indepdent)将加载到一个随机地址,即使你从GDB内部run加载它。

有关PIE的更多信息,请参阅32-bit absolute addresses no longer allowed in x86-64 Linux?

位置依赖可执行文件始终加载在同一地址,只有它们的堆栈地址可以随机化。代码+数据可以将地址硬编码为32位绝对值,并且它们不包含每个完成的地方的重定位信息。 (例如,如mov $string, %edi; call puts)。

使用/不使用-fPIE on the Godbolt compiler explorer查看gcc的Hello World代码。

.LC0:
    .string "Hello World!"
main:
    lea     rdi, .LC0[rip]     # RIP-relative with -fPIE
    sub     rsp, 8
    call    puts@PLT
    xor     eax, eax
    add     rsp, 8
    ret

但是-fno-PIE(Godbolt上的默认设置,通常不是现代Linux发行版的默认设置),你得到mov edi, OFFSET FLAT:.LC0,一个32位的绝对地址。

(代码的其余部分是相同的,除了它发出call puts并让链接器将其转换为call puts@PLT。使用-fno-plt内联间接call GOT地址。)