Lezione 4: Protezioni Moderne e Bypass
Stack Canaries (SSP)
Il compilatore GCC (opzione -fstack-protector) inserisce un valore casuale (canary) prima del return address. Prima di tornare dalla funzione, viene verificato. Se overflow, il canary cambia e il programma termina.
Bypass: se si riesce a indovinare il canary (talvolta riciclo da overflow parziale) oppure se si sovrascrive un altro buffer che non ha canary.
ASLR (Address Space Layout Randomization)
Randomizza gli indirizzi di base di heap, stack, librerie. Rende difficile prevedere indirizzi di librerie (es. system).
Bypass: se il binario non è position independent (PIE) e ha una regione non randomizzata (es. testo); oppure leaks di indirizzi via info leak; oppure uso di indirizzi relativi (calcolati in fase di exploit). In Windows, si può sfruttare la mancanza di ASLR su DLL non aggiornate.
DEP / NX (Data Execution Prevention / No eXecute)
Impedisce l'esecuzione di codice su stack o heap (flag di pagina ``NX``). Contromisura agli shellcode iniettati in memoria.
Bypass:
- Return-to-libc: riutilizzare codice esistente in librerie (es. chiamare
system("/bin/sh")senza iniettare shellcode). - ROP (Return-Oriented Programming): concatenare piccoli frammenti di codice (gadgets) terminati da
retgià presenti in memoria (solitamente in librerie o nel binario stesso). Permette di eseguire calcoli arbitrari. - JIT Spraying: iniezione in aree eseguibili (引擎JPEG, font).
ROP in Sintesi
L'exploit ROP costruisce una catena di indirizzi di ritorno a gadgets, ciascuno esegue poche istruzioni (es. pop rdi; ret), manipolando lo stack per soddisfare chiamate di sistema. È la tecnica predominante contro DEP/ASLR su sistemi moderni.
Esempio: return-to-libc su Linux x86
# Desideriamo: system("/bin/sh")
payload = b"A" * offset
payload += p32(system_addr) # indirizzo di system
payload += p32(exit_addr) # ritorno da system
payload += p32(binsh_addr) # indirizzo della stringa "/bin/sh" in memoria (es. in .data o leakata)
Non serve shellcode, solo indirizzi.
Protezioni in Windows
Windows ha da anni:
- SafeSEH (table di handler protetta)
- DEP per tutti i processi (da Vista)
- ASLR per sistema (dal Vista SP1, più robusto in Win10)
- Stack Guard (/GS) simile al canary.
Bypass Windows spesso richiede info leak per superare ASLR, uso di VirtualProtect per rendere eseguibile lo stack, o ROP su DLL di sistema.
Esercizio
Preparare un exploit return-to-libc per il binario vulnerabile, con ASLR disabilitato (echo 0 > /proc/sys/kernel/randomize_va_space). Trovare l'indirizzo di system e la stringa "/bin/sh" tramite readelf -s o strings.