Sono abbastanza familiare con ASLR, ma oggi ho sentito un nuovo fatto interessante sull'implementazione dell'ASLR in Windows.Bypassare ASLR di Windows determinando l'indirizzo della libreria utilizzando le pagine condivise
Per ottimizzare le prestazioni se il processo A e B caricano la stessa DLL, Windows lo caricherà solo una volta nella memoria fisica ed entrambi i processi condivideranno la stessa istanza tramite pagine condivise.
Questa è una vecchia notizia .. Ma la parte interessante è che entrambi i processi A e B caricheranno la libreria condivisa nello stesso indirizzo virtuale (perché ??).
Mi sembra che qualsiasi attacco locale (ad esempio escalation di privilegi) può facilmente aggirare ASLR dal seguente senso:
1. Create a new dummy process
2. Check the address of dlls of interest (kernel32, user32 ..)
3. Attack the privileged process and bypass ASLR with the information from step 2.
ho fatto alcuni semplici test con Olly e ha scoperto che le librerie condivise sono infatti caricati in lo stesso indirizzo virtuale.
Se questo è davvero il caso, ASLR è inutile per lo sfruttamento locale?
Se la DLL sarebbe caricato a un indirizzo diverso, allora deve essere trasferito e le pagine di RAM non possono più essere condivisi. Il punto principale di ASLR è che dove viene caricato sulla macchina non è lo stesso di dove è stato caricato sul mio. E quando lo riavvierai sarà diverso. –
Per quanto mi ricordo .. Ogni processo ha una tabella che traduce gli indirizzi delle pagine virtuali in pagine fisiche. Ogni processo ha una sua tabella univoca. Non è possibile caricare una volta la DLL nella RAM fisica di Microsoft e per ogni processo caricare la DLL in un indirizzo virtuale diverso? – Michael
No, il riposizionamento cambia il codice in modo che una copia non sia più valida. –