【发布时间】:2012-02-28 15:56:31
【问题描述】:
我预计由于地址空间布局随机化 (ALSR),从另一个进程派生的进程在调用 mmap 时将返回不同的地址。但我发现,事实并非如此。为此,我制作了以下测试程序。 malloc 返回的所有地址对于父母和孩子来说都是完全相同的。
请注意,cl1、cl2、pl1、pl2 的 malloc 在内部使用 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 的内核而改变...... -
@Basile:当然,每次运行都会获得不同的地址,但是对于一次运行,两个进程(父进程和子进程)的地址是否不同?
-
我只试了3次,但是父母和孩子的地址是一样的。