我期望由于地址空间布局随机化(ALSR),从另一个进程分叉的进程在调用mmap
时将返回不同的地址。但是,当我发现,情况并非如此。我为此做了以下测试程序。所有由malloc
返回的地址对父母和孩子完全相同。 注意,malloc
为CL1,CL2,PL1,PL2内部使用mmap
,因为他们是大块。地址空间布局随机化(ALSR)和mmap
所以,我的问题是,为什么mmap
即使存在ALSR也不会返回不同的地址。也许是因为这里随机化的种子对于原始和分叉过程是相同的。还是有其他原因吗?
int main()
{
pid = fork();
if (pid == 0) // child
{
void * c1 = malloc(4096);
void * c2 = malloc(4096);
void * cl1 = malloc((long)512e3); // internally uses mmap
void * cl2 = malloc((long)512e3); // internally uses mmap
printf("c1 = %p, c2 = %p, cl1 = %p, cl2 = %p!\n", c1, c2, cl1, cl2);
}
else
{
void * p1 = malloc(4096);
void * p2 = malloc(4096);
void * pl1 = malloc((long)512e3); // internally uses mmap
void * pl2 = malloc((long)512e3); // internally uses mmap
printf("p1 = %p, p2 = %p, pl1 = %p, pl2 = %p!\n", p1, p2, pl1, pl2);
}
return 0;
}
我不确定ASLR要求'mmap'返回不同的地址;它只是意味着它*可能*返回不同的。也许(只是一个猜测!)它是由'execve'触发的而不是'fork'触发的。当然,如果我连续两次启动程序,我会得到不同的地址。而这可能会随着未来的内核或者SELinux启用的内核而改变...... – 2012-02-28 16:10:01
你可能会觉得这很有用:http://xorl.wordpress.com/2011/01/16/linux-kernel-aslr-implementation/ – Necrolis 2012-02-28 16:14:58
@巴西尔:当然,你会得到不同的地址为每次运行,但一次运行,这两个进程(父母和孩子)的地址有没有不同? – MetallicPriest 2012-02-28 16:15:22