
Windows x86 PoC: buffer overflow basato su stack con shellcode personalizzato su legacy Windows 32-bit.
Questo è un tutorial semplice e autonomo sugli exploit di buffer overflow basati sullo stack per Windows a 32 bit. Nessuna guida esterna necessaria: tutto ciò di cui hai bisogno è qui.
vulnerable.c: Un programma semplice con una funzione gets() non sicura.messageBox.asm: Un piccolo payload in assembly che verrebbe eseguito dopo l'overflow.exploit.c: Un esempio di come l'overflow potrebbe essere innescato.Questo progetto insegna un'idea centrale: la lettura di input non sicura può permettere a un attaccante di sovrascrivere l'indirizzo di ritorno e reindirizzare l'esecuzione.
gets() non ha limiti di dimensioneIn vulnerable.c, il programma fa questo:
char buffer[32];
gets(buffer);
Il programma riserva 32 byte per buffer, poi chiama gets() per leggere l'input.
Il problema: gets() non controlla la dimensione del buffer.
Continua a leggere caratteri fino a quando non incontra un newline.
Se l'utente digita 40 o 50 caratteri, i caratteri extra traboccano oltre il buffer di 32 byte.
Quando una funzione C viene eseguita, lo stack (una regione di memoria) memorizza:
buffer)EBP salvato (base pointer della funzione chiamante)Immaginalo così:
Indirizzi più bassi (cima dello stack come disegnato)
[ buffer (32 byte) ]
[ EBP salvato (4 byte) ]
[ indirizzo di ritorno (4 byte) ]
Indirizzi più alti (fondo)
Quando gets() trabocca buffer con troppo input, i byte extra sovrascrivono il EBP salvato e poi l'indirizzo di ritorno.
Se costruiamo attentamente l'overflow per piazzare un indirizzo specifico nel campo dell'indirizzo di ritorno, la CPU salterà a quell'indirizzo quando la funzione tenta di ritornare.
buffer[32] nello stack.gets(buffer) per leggere una riga di input dell'utente.gets() non ha controllo di dimensione, quindi scrive tutti i 50 byte nel buffer.buffer e sovrascrivono il EBP salvato e l'indirizzo di ritorno.Questa è la forma più semplice di esecuzione di codice tramite buffer overflow.
messageBox.asm è un piccolo pezzo di codice progettato per essere eseguito dopo l'overflow.
Fa quanto segue:
LoadLibraryA con la stringa "USER32.DLL" per assicurarsi che la libreria sia in memoria.ExitProcess per terminare il programma in modo sicuro.Il punto chiave: questo è codice eseguibile che viene eseguito dopo che l'overflow ha reindirizzato l'esecuzione su di esso. Quando la finestra di messaggio appare sullo schermo, prova tre cose:
In un attacco reale, questo payload potrebbe fare qualsiasi cosa: rubare dati, creare un utente, scaricare malware, ecc. La finestra di messaggio è solo un modo visibile e sicuro per dimostrare che è avvenuta l'esecuzione di codice arbitrario.
Questo payload specifico utilizza indirizzi di memoria hardcodati per MessageBoxA (0x751D8830) e ExitProcess (0x7437ADB0).
Questi indirizzi sono specifici per un sistema. Il payload dovrebbe essere adattato per una versione o sistema Windows diverso.

Windows moderno ha molteplici funzionalità di sicurezza che impediscono questo exploit:
Per questo esercizio didattico, le disabilitiamo tutte.
Usa MSVC (Microsoft Visual C++) con flag specifici:
cl /c /GS- /W3 /Zl vulnerable.c
link /SUBSYSTEM:CONSOLE /DYNAMICBASE:NO /NXCOMPAT:NO vulnerable.obj /OUT:vulnerable.exe
Significato dei flag:
/GS- disabilita la protezione da sovrascrittura del buffer dello stack./DYNAMICBASE:NO disabilita l'Address Space Layout Randomization (ASLR)./NXCOMPAT:NO disabilita DEP, permettendo l'esecuzione di codice sullo stack.Se hai già l'eseguibile, puoi disabilitare le protezioni con editbin:
editbin /NXCOMPAT:NO /DYNAMICBASE:NO vulnerable.exe
vulnerable.exe.Questo README spiega:
gets() e perché non è sicuro (nessun limite di dimensione).Ora comprendi l'intero flusso dell'exploit di buffer overflow. Leggi i file di codice e confrontali con questa spiegazione per consolidare la tua comprensione.
Questo esempio è solo per scopi didattici. Non utilizzare questa tecnica contro sistemi di cui non possiedi o non hai esplicito permesso di testare. L'accesso non autorizzato a sistemi informatici è illegale.