bad*_*ack 3 linux debugging assembly gcc memory-address
看看这个主要:
int
main()
{
int asd = 10;
printf("%p\n", &asd);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
特定时刻 asd 的地址:
0x7ffff5f7c16c
Run Code Online (Sandbox Code Playgroud)
主要地址(始终相同):
(gdb) disass main
Dump of assembler code for function main:
0x00000000004005b4 <+0>: push %rbp
Run Code Online (Sandbox Code Playgroud)
为什么常规 c 程序的变量地址在每次执行时都会改变,而程序本身的起始地址总是相同的(假设它不是位置无关的)?我看到地址可变是由于ASLR模式,但为什么它只影响程序变量,而不影响代码分配的位置?这是否与作为代码部分 ro 在不是绝对必要的情况下随机化它没有意义的事实有关?
另外,为什么main的起始地址和变量asd的地址之间存在巨大的差距?
ASLR主要发生在mmap(2)时间。主线程的堆栈段在execve(2)时间(您的程序)分配- 但可能“随机”定位。您的初始堆栈指针main还取决于各种因素(特别是您的环境 - 请参阅environ(7))。
堆栈指针在execve时间设置。它通过例如x86-64 ABI规范中定义的约定传递给crt0.o启动对象文件(它调用您的main)。
的地址main在ELF可执行文件中是固定的。除非您的代码是与位置无关的代码(即使用-fPIE或-fPIC等编译...),否则无法移动(因为这需要特定的重定位)。objdump -f badnack在您的badnack可执行文件上使用以找出答案。也在pmap你的过程中。并且PIC的成本很小(它使用更多的寄存器)。
| 归档时间: |
|
| 查看次数: |
362 次 |
| 最近记录: |