gpt4 book ai didi

c - 为什么将一个变量设置为它自己的地址会在不同的程序运行时产生不同的结果?

转载 作者:太空狗 更新时间:2023-10-29 17:25:08 25 4
gpt4 key购买 nike

昨天我能跨this obfuscated C code implementing Conway's Game of Life .作为一个伪随机数生成器,它编写了这样的代码:

int pseudoRand = (int) &pseudoRand;

根据 the author's comments on the program :

This is a big number that should be different on each run, so it works nicely as a seed.

我相当有信心这里的行为是实现定义的或未定义的。但是,我不确定为什么这个值会因运行而异。我对大多数操作系统的工作方式的理解是,由于虚拟内存,每次运行程序时堆栈都被初始化为相同的虚拟地址,因此每次的地址应该相同。

这段代码实际上会在大多数操作系统上的不同运行中产生不同的结果吗?它依赖于操作系统吗?如果是这样,为什么操作系统会在每次运行时将同一个程序映射到不同的虚拟地址?

谢谢!

最佳答案

虽然地址分配给具有自动存储的对象是未指定的(地址到整数的转换是实现定义的),但你在你的情况下所做的只是窃取内核分配给初始值的熵堆栈地址作为 Address space layout randomization 的一部分(ASLR)。将其用作可能从您的程序中泄漏的熵源是一个坏主意,尤其是在通过网络与不受信任的、可能是恶意的远程主机进行交互的应用程序中,因为您实际上是在揭示随机信息内核给你的地址基础给一个可能想知道它的攻击者,从而破坏了 ASLR 的目的。 (即使你只是以此为种子,只要攻击者知道PRNG算法,他们就可以逆向得到种子。)

关于c - 为什么将一个变量设置为它自己的地址会在不同的程序运行时产生不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20305099/

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