linux-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程序的变量地址在每次执行时都会更改,而程序本身的起始地址却始终是相同的(假设它与位置无关)?
我看到地址可变性是由于ASLR模式引起的,但是为什么它只影响程序变量,却不影响代码的分配位置?这是否与以下事实有关:作为严格的代码部分,在没有严格必要的情况下将其随机化是没有意义的?
此外,为什么主程序的目标地址和变量asd的地址之间有巨大的差距?
解决方法:
ASLR大多发生在mmap(2)时间.主线程的堆栈段是在(程序的)execve(2)时间分配的,但是可能是“随机”放置的.您的main的初始堆栈指针还取决于各种因素(尤其是您的环境-请参见environ(7)).
堆栈指针在执行时间设置.它会按照(例如)中定义的约定传递到crt0.o
启动对象文件(调用您的主文件). x86-64 ABI规格.
main的地址固定在ELF可执行文件中.除非您的代码是position independent code(即使用-fPIE或-fPIC等编译的代码…),否则无法将其移动(因为这将需要特定的relocation).在badnack可执行文件上使用objdump -f badnack进行查找.还要在进程上使用pmap.而且PIC的成本很小(它使用更多的寄存器).
标签:debugging,assembly,gcc,memory-address,linux 来源: https://codeday.me/bug/20191029/1963185.html