Espero que debido a la aleatorización de diseño de espacio de direcciones (ALSR) un proceso bifurcado de otro proceso tenga direcciones diferentes devueltas al llamar al mmap
. Pero como descubrí, ese no era el caso. Hice el siguiente programa de prueba para ese propósito. Todas las direcciones devueltas por malloc
son exactamente iguales para el padre y el hijo. Tenga en cuenta que la malloc
para CL1, Cl2, PL1, PL2 utiliza internamente mmap
porque son grandes bloques.Aleación de diseño de espacio de direcciones (ALSR) y mmap
Entonces, mi pregunta es, ¿por qué mmap
no devuelve direcciones diferentes, incluso en presencia de ALSR. Tal vez sea porque la semilla para la aleatorización aquí es la misma para el proceso original y bifurcado. ¿O hay alguna otra razón?
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;
}
No estoy seguro de que ASLR requiera que 'mmap' devuelva direcciones diferentes; solo significa que * puede * devolver otros diferentes. Y quizás (¡solo una suposición!) Se desencadena más por 'execve' que por' fork'. Por supuesto, si comienzo dos veces seguidas su programa, obtendré direcciones diferentes. Y esto podría cambiar con los kernels futuros, o quizás con los habilitados para SELinux ... –
puede que le resulte útil: http://xorl.wordpress.com/2011/01/16/linux-kernel-aslr-implementation/ – Necrolis
@ Basile: Claro, obtendrá diferentes direcciones para cada ejecución, pero para una ejecución, ¿difieren alguna vez las direcciones de los dos procesos (padre e hijo)? – MetallicPriest