ASLR和地址

看看这个主要的:

int main() { int asd = 10; printf("%p\n", &asd); return 0; } 

asd在给定时刻的地址:

 0x7ffff5f7c16c 

主要地址(总是一样的):

 (gdb) disass main Dump of assembler code for function main: 0x00000000004005b4 <+0>: push %rbp 

为什么一个正则c程序的variables的地址在每次执行时都会改变,而程序本身的起始地址总是相同的(假设它不是位置独立的)? 我发现地址变化是由ASLR模式引起的,但是为什么它只影响程序variables,并不影响代码的分配位置? 这是否与作为代码部分ro的事实有关,如果不是绝对必要的,它是没有意义的随机化的?

此外,为什么主要的地址与variablesasd的地址之间有巨大的差距?

Solutions Collecting From Web of "ASLR和地址"

ASLR主要发生在mmap(2)时间。 主线程的堆栈段在execve(2)时间(你的程序)被分配 – 但可能是“随机”定位的。 你的main的初始堆栈指针也取决于各种因素(特别是你的环境 – 见environ(7) )。

堆栈指针在execve时间被设置。 它被传递给crt0.o启动目标文件(它调用你的main ),例如在x86-64 ABI规范中定义的约定。

main的地址在ELF可执行文件中是固定的。 除非你的代码是位置独立的代码 (即编译-fPIE-fPIC等),它不能被移动(因为这将需要特定的重定位 )。 在你的badnack可执行文件中使用objdump -f badnack来查找。 也pmap在你的过程。 和PIC有一个小的成本(它使用更多的寄存器)。