系统相关
首页 > 系统相关> > linux-ASLR和地址

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