为什么GDB和Objdump的指令地址是一样的?
Why addresses of instructions from GDB and Objdump are the same?
我正在研究逆向工程,这真的很有趣。
但是我有一个问题:为什么我从GDB和Objdump得到的指令地址是一样的?
不应该每次都在不同的地址加载二进制文件吗?
谢谢。
朱利安
GDB 默认禁用 ASLR。如果您 set disable-randomization off
,那么 PIE 可执行文件(位置独立)将加载到随机地址,即使您 run
它来自 GDB 内部也是如此。
有关 PIE 的更多信息,请参阅 32-bit absolute addresses no longer allowed in x86-64 Linux?。
Position-dependent 可执行文件 always 在同一地址加载,只有它们的堆栈地址可以随机化。 code+data 可以将地址硬编码为 32 位绝对地址,并且它们不包含完成该操作的每个位置的重定位信息。 (例如 mov $string, %edi
;call puts
)。
查看 Hello World 的 gcc 代码生成 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
并让链接器将其转换为 call puts@PLT
。使用 -fno-plt
内联间接 call
通过 GOT 地址。)
我正在研究逆向工程,这真的很有趣。
但是我有一个问题:为什么我从GDB和Objdump得到的指令地址是一样的?
不应该每次都在不同的地址加载二进制文件吗?
谢谢。 朱利安
GDB 默认禁用 ASLR。如果您 set disable-randomization off
,那么 PIE 可执行文件(位置独立)将加载到随机地址,即使您 run
它来自 GDB 内部也是如此。
有关 PIE 的更多信息,请参阅 32-bit absolute addresses no longer allowed in x86-64 Linux?。
Position-dependent 可执行文件 always 在同一地址加载,只有它们的堆栈地址可以随机化。 code+data 可以将地址硬编码为 32 位绝对地址,并且它们不包含完成该操作的每个位置的重定位信息。 (例如 mov $string, %edi
;call puts
)。
查看 Hello World 的 gcc 代码生成 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
并让链接器将其转换为 call puts@PLT
。使用 -fno-plt
内联间接 call
通过 GOT 地址。)