Fuzzing per trovare i crash
Individuare l'offset
Fuzzing per trovare i crash è una lezione Ethical Hacking Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Ethical Hacking Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Ethical Hacking Academy include 4 lezioni in totale.
Che cos'è il fuzzing?
Il fuzzing consiste nell'inviare a un programma input malformati o sovradimensionati per provocare un comportamento imprevisto, in particolare un crash. Un crash spesso segnala un bug di corruzione della memoria.
Nel caso dei buffer overflow, il primo obiettivo è mandare in crash il programma, per verificare l'esistenza di un overflow.
Il flusso di lavoro
Il classico flusso di lavoro per lo sfruttamento è:
- Eseguire il fuzzing per mandare in crash il programma.
- Trovare l'offset esatto fino all'indirizzo di ritorno.
- Controllare EIP.
- Reindirizzare l'esecuzione allo shellcode.
Questa lezione tratta i primi due passaggi.
Collegare un debugger
Per osservare i crash, colleghi un debugger (ad esempio Immunity Debugger o x64dbg su Windows, oppure GDB su Linux) al programma bersaglio.
Quando il programma va in crash, il debugger mostra lo stato dei registri, in particolare di EIP, rivelando se l'indirizzo di ritorno è stato sovrascritto.
Inviare input di lunghezza crescente
Un fuzzer semplice invia stringhe sempre più lunghe finché il programma va in crash. Un punto di partenza comune consiste nell'inviare molti caratteri «A» (0x41).
Se dopo il crash EIP mostra 41414141, ha confermato il controllo sull'indirizzo di ritorno.
python -c 'print("A"*2000)' | ./vulnConfermare il crash
Quando l'applicazione va in crash e EIP è uguale a 41414141, l'overflow ha raggiunto l'indirizzo di ritorno salvato.
Tuttavia, non sa ancora esattamente quanti byte precedono EIP. Inviare sempre lo stesso byte conferma che EIP è controllabile, ma non indica dove si trova.
Trovare l'offset: pattern ciclici
Per trovare l'offset preciso, invii un pattern univoco non ripetitivo invece di usare solo «A». Ogni finestra di 4 byte è distinta, quindi il valore che finisce in EIP identifica l'offset.
Metasploit include pattern_create.rb per questo scopo.
msf-pattern_create -l 2000Leggere l'offset
Dopo il crash con il pattern, annoti il valore presente in EIP. Lo passi a pattern_offset.rb, che restituisce il numero esatto di byte prima di EIP.
Questo offset corrisponde alla dimensione del padding prima dei byte dell'indirizzo di ritorno.
msf-pattern_offset -l 2000 -q 39654138Verificare l'offset
Verifichi sempre il risultato. Costruisca un input composto da offset byte «A», seguiti da quattro byte «B» (0x42). Se EIP diventa 42424242, l'offset è esatto.
Questa conferma evita di perdere ore a eseguire il debug di un errore di pochi byte più avanti.
"A"*offset + "B"*4 # EIP should become 42424242Individuare ESP
Dopo aver preso il controllo di EIP, annoti anche dove punta ESP al momento del crash. Di solito ESP punta subito dopo l'indirizzo di ritorno sovrascritto, all'interno del buffer rimanente.
Sarà questo lo spazio in cui inserirà successivamente lo shellcode.
Riepilogo degli strumenti
Tra gli strumenti utili per il fuzzing e i pattern sono inclusi:
- Spike e boofuzz: fuzzer per protocolli di rete.
- pattern_create / pattern_offset: individuano l'offset di EIP.
- mona.py in Immunity: automatizza le attività relative a pattern, offset e caratteri non validi.
!mona pattern_create 2000L'importanza della riproducibilità
Un crash utile deve essere riproducibile. Salvi l'input esatto che lo provoca e ripeta l'esecuzione partendo da uno stato pulito, per confermare che l'offset sia stabile.
I crash incoerenti spesso indicano che il bug non è un semplice stack overflow oppure che una condizione (tempistica, lunghezza o contenuto) varia tra un'esecuzione e l'altra.
Verifica rapida
Ricordi perché un pattern ciclico è migliore di una stringa composta da byte identici.
Riepilogo
Ora sa come trovare l'offset del crash:
- Esegua il fuzzing con input di lunghezza crescente per provocare un crash; lo confermi con
41414141in EIP. - Usi un pattern ciclico con
pattern_create/pattern_offsetper trovare l'offset esatto. - Verifichi il risultato con padding seguito da quattro byte «B» (42424242).
- Annoti dove punta ESP per inserire successivamente lo shellcode.
Nel prossimo passaggio prenderà completamente il controllo di EIP e reindirizzerà l'esecuzione.
Domande Frequenti
La lezione «Fuzzing per trovare i crash» è gratuita?
Sì — il testo completo di «Fuzzing per trovare i crash» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Ethical Hacking Academy, passa a CoddyKit PRO. Il corso Ethical Hacking Academy include 4 lezioni in totale.
Cosa imparerò in «Fuzzing per trovare i crash»?
Individuare l'offset Eserciti Ethical Hacking Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Ethical Hacking Academy?
Non è richiesta alcuna esperienza precedente. Ethical Hacking Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Fuzzing per trovare i crash»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Ethical Hacking Academy?
Sì. Ogni lezione Ethical Hacking Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Memoria e stack
- Fuzzing per trovare i crash
- Controllo di EIP
- Shellcode ed exploit