Silvestro Di Pietro, una passione informatica.

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:

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:

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.

← Torna al corso