我正在深入了解逆向工程,这非常有趣。
我有一个问题:为什么我从 GDB 和 Objdump 获得的说明地址是相同的?
每次不应该将二进制文件加载到不同的地址吗?
谢谢。 于连
答案 0 :(得分:2)
GDB默认禁用ASLR。如果你set disable-randomization off
,那么PIE可执行文件(Position Indepdent)将加载到一个随机地址,即使你从GDB内部run
加载它。
有关PIE的更多信息,请参阅32-bit absolute addresses no longer allowed in x86-64 Linux?。
位置依赖可执行文件始终加载在同一地址,只有它们的堆栈地址可以随机化。代码+数据可以将地址硬编码为32位绝对值,并且它们不包含每个完成的地方的重定位信息。 (例如,如mov $string, %edi
; call puts
)。
使用/不使用-fPIE
on the Godbolt compiler explorer查看gcc的Hello World代码。
.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地址。)