请看一下这个主要部分:
int
main()
{
int asd = 10;
printf("%p\n", &asd);
return 0;
}asd在特定时刻的地址:
0x7ffff5f7c16cmain地址(始终相同):
(gdb) disass main
Dump of assembler code for function main:
0x00000000004005b4 <+0>: push %rbp为什么变量、常规c程序的地址在每次执行时都会发生变化,而程序本身的起始地址却总是相同的(假设它不是位置独立的)?我看到地址变异性是由于ASLR模式造成的,但是为什么它只影响程序变量,而不影响代码的分配位置?这是否与这样一个事实有关:作为代码部分ro,在没有严格必要的情况下将其随机化是没有意义的吗?
此外,为什么主地址与变量asd地址之间存在着巨大的差距?
发布于 2014-02-23 18:11:59
ASLR主要发生在mmap(2)时间。主线程的堆栈段是在execve(2)时(您的程序)分配的,-but可能是“随机”的。main的初始堆栈指针也取决于各种因素(特别是您的环境-参见环境(7))。
堆栈指针在execve时设置。它通过在例如crt0.o规范中定义的约定传递给main启动对象文件(该文件调用您的x86-64 ABI )。
main的地址固定在小精灵可执行文件中。除非您的代码是位置独立码 (即用-fPIE或-fPIC等编译),否则不能移动它(因为这需要特定的搬迁)。使用objdump -f badnack对您的badnack可执行文件进行查找。在您的过程中也是pmap。而且PIC的成本很小(它使用更多的寄存器)。
https://stackoverflow.com/questions/21972148
复制相似问题