mmap()的熵的ASLR位

我正在学习x86系统上的mmap()的ASLR随机化。 我已经读了很多地方,在用mmap()加载的地址上有16位随机数。

但在我发现的源代码中:

static unsigned long mmap_rnd(void) 02 { 03 unsigned long rnd = 0; 04 05 /* 06 * 8 bits of randomness in 32bit mmaps, 20 address space bits 07 * 28 bits of randomness in 64bit mmaps, 40 address space bits 08 */ 09 if (current->flags & PF_RANDOMIZE) { 10 if (mmap_is_ia32()) 11 rnd = (long)get_random_int() % (1<<8); 12 else 13 rnd = (long)(get_random_int() % (1<<28)); 14 } 15 return rnd << PAGE_SHIFT; 16 } 

所以,那只会是8位的随机性。

但实际上,运行一些testing,我得到以下地址(stack-heap-mmap)bf937000,09a60000,b774b000

bfa86000,090ef000,b76e2000

它超过16位,如果它可以是b77XX000和b76XX000!

任何帮助吗?

PAGE_SHIFT正在将该随机性移动到不同的位位置。 你的mmap地址之间的区别确实是:

  b774b000 -b76e2000 --------- 69000 

我不知道PAGE_SHIFT的值是PAGE_SHIFT ,但是如果它是12的话,那么你有0x69差别,完全适合8位。