加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

为什么每次运行程序时argc的地址都不同?

发布时间:2020-12-16 04:54:16 所属栏目:百科 来源:网络整理
导读:今天我遇到了以下情况.我运行了几次以下程序: #include stdio.hint main(int argc,char **argv) { printf("%pn",argc);} 在带有linux和gcc编译器的Intel i7上,该程序在每次运行时提供不同的输出: i7:~/tmp$gcc t.c i7:~/tmp$./a.out 0x7fffc127636ci7:~/t
今天我遇到了以下情况.我运行了几次以下程序:
#include <stdio.h>
int main(int argc,char **argv) {
  printf("%pn",&argc);
}

在带有linux和gcc编译器的Intel i7上,该程序在每次运行时提供不同的输出:

i7:~/tmp$gcc t.c 
i7:~/tmp$./a.out 
0x7fffc127636c
i7:~/tmp$./a.out 
0x7fffdefed97c
i7:~/tmp$./a.out 
0x7fff7f32454c

我希望linux,elf,gcc或其他任何相关的开发人员都会尝试确保在每次调用程序时堆栈都位于同一地址上.它将有助于跟踪和修复在处理指针和变量地址时可能发生的奇怪错误(类似于虚拟地址更好地修复与物理地址相比的错误).

我想知道为什么在每次调用程序时堆栈都映射到不同的地址?

解决方法

这是出于安全原因,因此攻击者无法对变量,函数的确切内存布局做出太多假设……

让我鼓励您阅读有关“缓冲区溢出攻击”(可能的原因之一)和“ASLR”(地址空间布局随机化)的可能预防性部分策划之一.

所以编译器生成固定地址就是这种情况,但运行时改变了一些事情……

如果要更改该行为,请参阅disable ASLR in Linux.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读