Controllo di EIP
Sovrascrivere l'indirizzo di ritorno
Controllo di EIP è una lezione Ethical Hacking Academy gratuita su CoddyKit. Questa è la lezione 3 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.
L'obiettivo
Conoscendo l'offset, può inserire quattro byte qualsiasi in EIP. Ora la domanda è: quale indirizzo deve inserirvi?
Vuole far puntare EIP allo shellcode. Tuttavia, non può semplicemente codificare l'indirizzo dello stack: le serve un salto affidabile.
Perché non codificare l'indirizzo dello stack?
L'indirizzo dello stack in cui si trova lo shellcode può cambiare tra un'esecuzione e l'altra e tra sistemi diversi. Anche piccole variazioni dell'ambiente possono spostarlo.
Utilizza invece un'istruzione stabile già presente in memoria, che reindirizza l'esecuzione verso il punto a cui punta attualmente ESP.
Il trucco JMP ESP
Se al momento del crash ESP punta allo shellcode, può impostare EIP sull'indirizzo di un'istruzione JMP ESP. Quando EIP carica quell'indirizzo, la CPU esegue jmp esp e salta allo shellcode.
Questa indirezione rende l'exploit affidabile indipendentemente dall'indirizzo esatto dello stack.
jmp esp ; opcode FF E4Trovare un JMP ESP
Cerca nei moduli caricati (preferibilmente quelli senza ASLR) i byte dell'opcode FF E4. L'indirizzo di base del modulo rimane costante, quindi questo gadget è affidabile.
Strumenti come mona.py trovano automaticamente le istruzioni adatte.
!mona jmp -r esp -cpb "\x00"Evitare i caratteri non validi
Alcuni valori di byte danneggiano l'input prima che raggiunga intatto il buffer. Il caso classico è il byte nullo 0x00, che termina le stringhe C. Altri esempi sono 0x0a (nuova riga) e 0x0d (ritorno carrello).
L'indirizzo JMP ESP non deve contenere nessuno di questi caratteri non validi.
Individuare i caratteri non validi
Per individuare i byte non validi, invii nel buffer tutti i valori da 0x00 a 0xff e ispezioni la memoria nel debugger. I byte alterati o mancanti sono caratteri non validi.
Dovrà escluderli sia dall'indirizzo di ritorno sia dallo shellcode.
!mona bytearray -cpb "\x00"Costruire la sovrascrittura di EIP
Ora assembli l'input: padding fino all'offset, quindi l'indirizzo JMP ESP in ordine little-endian.
Se JMP ESP si trova all'indirizzo 0x625011AF, i byte scritti vengono invertiti.
buf = "A"*offset + "\xaf\x11\x50\x62" # 0x625011AF, little-endianVerificare il salto
Imposti un breakpoint sull'indirizzo JMP ESP nel debugger ed esegua l'exploit. Quando EIP lo raggiunge e passa a ESP, ha confermato il reindirizzamento affidabile.
A questo punto EIP punta al punto in cui verrà inserito lo shellcode.
Creare spazio per lo shellcode
Dopo l'indirizzo di ritorno, il buffer rimanente (a cui punta ESP) contiene lo shellcode. Se lo spazio è limitato, potrebbe essere necessario usare un salto breve o spostare il contenuto.
Uno NOP sled (una sequenza di byte no-op 0x90) prima dello shellcode aggiunge un margine di tolleranza, consentendo al salto di atterrare in un punto qualsiasi della sequenza.
buf = "A"*offset + ret + "\x90"*16 + shellcodeMettere insieme i componenti
La struttura completa dell'exploit è ora chiara:
- Padding fino all'offset.
- L'indirizzo JMP ESP (senza caratteri non validi, in formato little-endian).
- Uno NOP sled.
- Lo shellcode.
Manca un solo passaggio per ottenere una shell.
Alternative a JMP ESP
JMP ESP è il reindirizzamento classico, ma non è l'unico. Se un altro registro punta al buffer, può utilizzare jmp eax, call esp oppure un gadget push esp; ret.
Il principio è lo stesso: trovare un'istruzione stabile che trasferisca il controllo al punto in cui si trova lo shellcode.
Verifica rapida
Ricordi perché si preferisce JMP ESP a un indirizzo dello stack codificato.
Riepilogo
Ora controlla il flusso di esecuzione:
- Sovrascriva EIP con l'indirizzo di un gadget JMP ESP invece di usare un fragile indirizzo dello stack.
- Trovi il gadget in un modulo non soggetto ad ASLR, evitando i caratteri non validi come
0x00. - Scriva l'indirizzo in formato little-endian e aggiunga uno NOP sled prima dello shellcode.
Nel prossimo passaggio genererà lo shellcode e avvierà una shell.
Domande Frequenti
La lezione «Controllo di EIP» è gratuita?
Sì — il testo completo di «Controllo di EIP» è 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 «Controllo di EIP»?
Sovrascrivere l'indirizzo di ritorno 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 3 di 4.
Quanto tempo richiede la lezione «Controllo di EIP»?
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