Spodziewam się, że z powodu Randomization Layout przestrzeni adresowej (ALSR) proces rozwidlony z innego procesu będzie miał inne adresy zwrócone podczas wywoływania mmap
. Ale jak się dowiedziałem, tak nie było. W tym celu wykonałem następujący program testowy. Wszystkie adresy zwrócone przez malloc
są dokładnie takie same dla rodzica i dziecka. Zauważ, że malloc
dla CL1, CL2, PL1, PL2 wewnętrznie używa mmap
bo są duże bloki.Randomizacja układu adresu (ALSR) i mmap
Moje pytanie brzmi, dlaczego mmap
nie zwraca różnych adresów nawet w obecności ALSR. Może to dlatego, że nasiono do randomizacji jest takie samo dla oryginalnego i rozwidlonego procesu. Czy jest jakiś inny powód?
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;
}
Nie jestem pewien, czy ASLR wymaga, aby 'mmap' zwracał różne adresy; oznacza to tylko, że * może * zwrócić różne. I być może (po prostu przypuszczenie!) Jest on uruchamiany bardziej przez 'execve' niż przez' fork'. Na pewno, jeśli uruchomię dwa razy z rzędu twój program, otrzymuję różne adresy. A to może się zmienić w przyszłych jądrach, lub może z włączonymi SELinux ... –
może ci się przydać: http://xorl.wordpress.com/2011/01/16/linux-kernel-aslr-implementation/ – Necrolis
@ Basile: Oczywiście, otrzymasz różne adresy dla każdego biegu, ale czy w jednym biegu adresy obu procesów (rodzic i dziecko) różnią się od siebie? – MetallicPriest