gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:24:19 25 4
gpt4 key购买 nike

今天遇到了下面的情况。我多次运行以下程序:

#include <stdio.h>
int main(int argc, char **argv) {
printf("%p\n", &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例如。

关于c - 为什么每次运行程序时 argc 的地址都不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40935207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com