ASLR aleatoriza las direcciones del código ejecutable del proceso, la pila, el montón y las bibliotecas. Esto es para dificultar la vida de un atacante, ya que no pueden codificar las direcciones en el código en múltiples instancias.
¿Pero cómo ayuda esto con las bibliotecas del sistema? Nunca se descargan. Cada proceso usa libc, por ejemplo, y por lo tanto la dirección de prinf nunca cambia. ¿Cómo me ayuda esto si estoy codificando la dirección de printf? Esto no cambia a menos que la máquina se reinicie.
Tengo ASLR habilitado -
# cat /proc/sys/kernel/randomize_va_space
2
Aquí hay un código de ejemplo -
unsigned long getEBP ( void )
{
asm("movl %ebp, %eax");
}
int main(void)
{
int (*p)(const char*, ...) = &printf;
printf("printf address = %p \n", p);
(*p)("printf address = %p\n", &printf);
printf ("EBP:%x\n" ,getEBP ());
}
Y la salida a través de múltiples ejecuciones -
# ./a.out
printf address = 0x4003c0
printf address = 0x4003c0
EBP:6a71d300
# ./a.out
printf address = 0x4003c0
printf address = 0x4003c0
EBP:93e5c100
Vea que el EBP está cambiando como debería pero no la dirección de printf.
¿Qué me estoy perdiendo?
EDITAR: Compilar con -fPIC no ayudó en mi máquina virtual RHEL.
# ./a.out
printf address = 0x3047a4f0f0
printf address = 0x3047a4f0f0
EBP:7aaac900
# ./a.out
printf address = 0x3047a4f0f0
printf address = 0x3047a4f0f0
EBP:632eca20
Si las llamadas libc son de hecho aleatorias como la respuesta dice a continuación, ¿cómo se implementa? libc en sí no se vuelve a cargar, por lo que la dirección real de printf no cambia, ¿cómo se puede aleatorizar?