首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASLR和地址

ASLR和地址
EN

Stack Overflow用户
提问于 2014-02-23 18:02:01
回答 1查看 530关注 0票数 3

请看一下这个主要部分:

代码语言:javascript
复制
int 
main() 
{
  int asd = 10;
  printf("%p\n", &asd);
  return 0;
}

asd在特定时刻的地址:

代码语言:javascript
复制
0x7ffff5f7c16c

main地址(始终相同):

代码语言:javascript
复制
(gdb) disass main
Dump of assembler code for function main:
    0x00000000004005b4 <+0>:    push   %rbp

为什么变量、常规c程序的地址在每次执行时都会发生变化,而程序本身的起始地址却总是相同的(假设它不是位置独立的)?我看到地址变异性是由于ASLR模式造成的,但是为什么它只影响程序变量,而不影响代码的分配位置?这是否与这样一个事实有关:作为代码部分ro,在没有严格必要的情况下将其随机化是没有意义的吗?

此外,为什么主地址与变量asd地址之间存在着巨大的差距?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-23 18:11:59

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

堆栈指针在execve时设置。它通过在例如crt0.o规范中定义的约定传递给main启动对象文件(该文件调用您的x86-64 ABI )。

main的地址固定在小精灵可执行文件中。除非您的代码是位置独立码 (即用-fPIE-fPIC等编译),否则不能移动它(因为这需要特定的搬迁)。使用objdump -f badnack对您的badnack可执行文件进行查找。在您的过程中也是pmap。而且PIC的成本很小(它使用更多的寄存器)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21972148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档