c - 为什么GDB和Objdump的指令地址是一样的?

标签 c assembly gdb reverse-engineering objdump

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

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

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

谢谢。 朱利安

最佳答案

GDB 默认禁用 ASLR。如果您关闭禁用随机化,那么即使您从 GDB 中运行 PIE 可执行文件(位置独立)也会加载到随机地址。

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

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

使用/不使用 -fPIE 查看 gcc 的 Hello World 代码生成 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 并让链接器将其转换为 call puts@PLT。使用 -fno -plt 通过 GOT 地址内联一个间接 调用。)

关于c - 为什么GDB和Objdump的指令地址是一样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50594438/

相关文章:

c - 如何使此功能更加模块化并用于结构的多个成员?

c - fork /执行 : child exits when trying to redirect stdin/stdout

assembly - MOV D D 是什么意思?

assembly - Turbo 汇编器多输入重叠

objective-c - GDB 不支持@dynamic 属性?

部分匹配的 gdb 搜索命令历史记录

c - Linux 中的 gdb7.7.1。当我尝试运行 gdb 时出现 "no debugging symbols found"

c - 为什么每次迭代都会打印两次消息?

c - 关于x86-64汇编语言中的局部变量寄存器的问题

gdb - 如何使用GDB查找Android目标处理器的基地址