gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:55:13 24 4
gpt4 key购买 nike

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

但是我有一个问题:为什么我从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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com