2011-11-17 35 views

回答

10

是的。

但是请注意,在fork之后,父母和孩子都应用相同的随机化(毕竟他们是彼此的副本!)。

如果孩子和父母打电话给mmap(NULL, ...),然后他们的地址映射将开始发散。

更新:

是不是你的说法矛盾吗?

根本不是。紧接在fork之后,父地址和子地址空间是相同的(这就是fork所做的定义)。但是ASLR对父母和孩子仍然有效。随机化不能“及时回溯”并随机化已经做出的决定,但是任何未来的决定(例如何处放置下一个mmap随机化,并且可能导致父母和孩子的不同结果。

它是否与基本的mmap或操作系统编写者在mmap中引入随机性以及安全性有关?

也许你不明白什么是ASLR?

总之,使用ASLR时,操作系统将为r andomize placement of main stack, and placement of any non-MAP_FIXED mmaps

当你fork,主要的堆放置已经确定,所以父母和孩子将有相同的。未来mmap是唯一可以(也将会)受ASLR影响的事情。

+0

你先说是,然后说他们会一样。你的言论是不是矛盾?还是你的意思是父进程的地址布局将在fork调用时动态地改变以匹配分叉进程的那一个?看起来不太可能。为什么mmap使他们分歧?这是否与基本的mmap或操作系统作家在mmap中引入了随机性以及安全性? – MetallicPriest

+1

@MetallicPriest:孩子与父母具有相同的随机化:即使两个进程都以相同的内存映射开始,该内存映射也是随机的。在不同的规模上,'preload -r'设置库的随机预加载地址,每次加载库时加载器都会尝试加载它在相同的地址,但该地址仍然是随机的(并且与具有相同地址的其他系统不同发行版)。 – ninjalj

+0

接受完整而有礼貌的答案让我感觉很好。 – gnometorule