【问题标题】:Why addresses of instructions from GDB and Objdump are the same?为什么 GDB 和 Objdump 的指令地址相同?
【发布时间】:2018-11-08 16:54:02
【问题描述】:

我正在研究逆向工程,这真的很有趣。

但是我有一个问题:为什么我从 GDBObjdump 得到的指令地址是一样的?

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

谢谢。 朱利安

【问题讨论】:

  • 传统上,二进制文件被加载到 Unix 上的固定地址。您可以拥有仅在运行时确定加载地址的二进制文件,这称为 PIE(与位置无关的可执行文件)。
  • ...每个进程都有自己的虚拟地址空间,因此固定地址不会造成地址冲突的风险。
  • 是的,实际上你都对,我没有考虑地址空间。谢谢你们的回答。

标签: c assembly gdb reverse-engineering objdump


【解决方案1】:

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

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

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

查看带有/不带有 -fPIE on the Godbolt compiler explorer 的 Hello World 的 gcc 代码生成。

.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 通过GOT 地址内联间接call。)

【讨论】:

    猜你喜欢
    • 2016-02-08
    • 2020-10-02
    • 2022-11-23
    • 2022-11-25
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 2019-07-15
    相关资源
    最近更新 更多