gpt4 book ai didi

linux - ASLR 和地址

转载 作者:太空狗 更新时间:2023-10-29 11:04:37 26 4
gpt4 key购买 nike

看看这个主要的:

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 程序的变量地址在每次执行时都会发生变化,而程序本身的起始地址却始终相同(假设它不是位置独立的)?我看到地址可变性是由于 ASLR 模式,但为什么它只影响程序变量,而不影响代码分配的位置?这是否与以下事实有关:作为代码部分 ro,在非绝对必要时将其随机化是没有意义的?

另外,为什么main的tarting地址和变量asd的地址差距这么大?

最佳答案

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

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

main 的地址固定在 ELF 中可执行文件。除非你的代码是 position independent code (即使用 -fPIE-fPIC 等编译),它不能移动(因为这需要特定的 relocation )。在您的 badnack 可执行文件上使用 objdump -f badnack 来找出答案。还有 pmap 在你的过程中。而且PIC的成本很小(它使用了更多的寄存器)。

关于linux - ASLR 和地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21972148/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com