我期望由於地址空間佈局隨機化(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