ASLR randomizza gli indirizzi del codice eseguibile del processo, stack, heap e librerie. Ciò serve a rendere difficile la vita di un utente malintenzionato poiché non è possibile codificare gli indirizzi nel codice attraverso più istanze.
Ma come può essere d'aiuto con le librerie di sistema? Non vengono mai scaricati. Ogni processo usa libc, per esempio, e quindi l'indirizzo di prinf non cambia mai. Come può essere d'aiuto se sto codificando l'indirizzo di printf? Questo non cambia a meno che la macchina non si riavvii.
Ho ASLR abilitato -
# cat /proc/sys/kernel/randomize_va_space
2
Ecco alcuni esempi di codice -
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 ());
}
E l'output su più esecuzioni -
# ./a.out
printf address = 0x4003c0
printf address = 0x4003c0
EBP:6a71d300
# ./a.out
printf address = 0x4003c0
printf address = 0x4003c0
EBP:93e5c100
Vedi l'EBP sta cambiando come dovrebbe ma non l'indirizzo di printf.
Cosa mi manca?
EDIT: la compilazione con -fPIC non ha aiutato la mia macchina virtuale RHEL.
# ./a.out
printf address = 0x3047a4f0f0
printf address = 0x3047a4f0f0
EBP:7aaac900
# ./a.out
printf address = 0x3047a4f0f0
printf address = 0x3047a4f0f0
EBP:632eca20
Se le chiamate alla libc sono di fatto randomizzate come la risposta dice sotto, come viene implementata? la stessa libc non viene ricaricata, quindi l'indirizzo effettivo di printf non cambia, come può essere randomizzato?