【问题标题】:ASLR and addressesASLR 和地址
【发布时间】:2014-02-23 18:02:01
【问题描述】:

看看这个主要的:

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的地址差距这么大?

【问题讨论】:

标签: linux debugging gcc assembly memory-address


【解决方案1】:

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 成本低(它使用更多的寄存器)。

【讨论】:

  • 我明白了,但是假设程序不是位置独立的,为什么堆栈可能是随机分配的,而主程序不是?
  • 因为移动main 需要重新定位代码。
  • 为什么栈会被移动?
  • 它不是移动,它是在execve时间随机初始化的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2022-01-14
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多