我正在研究逆向工程,这真的很有趣。
但是我有一个问题:为什么我从GDB 和Objdump 得到的指令地址是一样的?
不应该每次都在不同的地址加载二进制文件吗?
谢谢。 朱利安
最佳答案
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/