Linux ASLR如何确切地随机化堆栈位置

3
我正在使用32位x86 Ubuntu桌面版。我查看了/proc/[pid]/mmaps,并发现堆栈基地址总是变化的(例如,在下面的情况中为0xbfe76000)。因此,我猜测内核(或ELF加载程序)必须在每次进程启动时随机化堆栈位置。
我想知道堆栈基地址随机化的确切代码(在内核或ELF加载程序中的哪个位置)。因为我想分配一些页面(例如通过mmap)到0xC0000000以下,我不确定堆栈是否可能位于0xbffff000之类的位置。谢谢!
... ...
b7762000-b7763000 rw-p 00020000 fc:00 1188263    /lib/i386-linux-gnu/ld-2.19.so
bfe55000-bfe76000 rw-p 00000000 00:00 0          [stack]
1个回答

0

这并不是一个直接的答案(因为ASLR机制在不同内核版本中发生了一些变化)。最近的4.6内核中有几个aslr字符串出现。

但是关于您的问题,您可以通过查询内核的/proc/self/maps来查找堆栈段,然后使用MAP_FIXED标志将mmap映射到这些段之外的某个地方。


谢谢,但这并不能完全解决我的问题。因为我想在所有用户空间内存区域的顶部分配内存。所以最好的方法是找出堆栈页面是如何分配的(我猜ASLR会为堆栈基地址保留一个范围,希望该范围不包括最顶部的用户空间地址)。 - xiaogw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接