我正在研究逆向工程,这真的很有趣。
然而,我有一个问题:为什么我从GDB和Objdump得到的指令地址是相同的?
不应该每次都将二进制文件加载到不同的地址吗?
谢谢。朱利安
发布于 2018-05-30 08:18:34
默认情况下,GDB会禁用ASLR。如果你在GDB中使用run,那么一个派的可执行文件(独立位置)将会加载到一个随机的地址。
有关派的更多信息,请参见32-bit absolute addresses no longer allowed in x86-64 Linux?。
位置相关的可执行文件始终加载在相同的地址,并且只有它们的堆栈地址可以随机化。code+data可以将地址硬编码为32位绝对地址,并且它们不包含执行此操作的每个位置的重新定位信息。(例如,像mov $string, %edi;call puts)。
看看gcc在有/没有-fPIE on the Godbolt compiler explorer的情况下为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通过GOT地址内联间接call。)
https://stackoverflow.com/questions/50594438
复制相似问题