Я ожидаю, что из-за рандомизации макета адресного пространства (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 ... –
вам может показаться полезным: http://xorl.wordpress.com/2011/01/16/linux-kernel-aslr-implementation/ – Necrolis
@ Базиле: Конечно, вы будете получать разные адреса для каждого прогона, но за один прогон, когда-либо отличаются адреса обоих процессов (родительский и дочерний)? – MetallicPriest