代码之家  ›  专栏  ›  技术社区  ›  Julien Séveno-Piltant

为什么来自gdb和objdump的指令地址相同?

  •  0
  • Julien Séveno-Piltant  · 技术社区  · 7 年前

    我正在从事逆向工程,这真的很有趣。

    然而,我有一个问题:为什么我收到指示的地址 GDB 目标 是一样的吗?

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

    谢谢您。 朱利安

    1 回复  |  直到 7 年前
        1
  •  2
  •   Peter Cordes    7 年前

    默认情况下,gdb禁用aslr。如果你 set disable-randomization off ,则饼图可执行文件(位置不确定)将加载到随机地址,即使在 run 它来自GDB内部。

    32-bit absolute addresses no longer allowed in x86-64 Linux? 关于派的更多信息。

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

    查看gcc的代码gen for hello world with/without -fPIE on the Godbolt compiler explorer

    .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@PLT . 使用 -fno-plt 插入间接 call 通过得到的地址。)

    推荐文章