will ESP point to the start of the exploit codes (which will be some combinations of shell codes and gibbersih)?
In realtà, è EIP che indicherà l'inizio del codice exploit invece di ESP. In un classico overflow del buffer di stack, ESP continuerà ad essere dove sarebbe stato con / senza codice exploit. L'unica cosa che sovrascrivi è l'EIP che lo cambia in un indirizzo diverso in memoria - dove hai già "piantato" il tuo codice exploit in qualche modo.
Per illustrare vediamo il diagramma di una pila e i valori delle note di vari registri:
Supponiamochecisiaunbuffersfruttabilenellafunzionedelcalleeincuièpossibilefornireunaquantitàarbitrariadidati(gets,rouguesrtcpy,ecc.).L'attaccantecalcolailnumeroesattodibyteprimadelpuntoinpilaincuièmemorizzatol'indirizzodiritorno(EIP).Quindil'inputpotrebbeesserediforma(ognibloccocorrispondenteaciascunarigarossasotto).
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0834FD4C
dove0834FD4Cèilnuovopuntatorediistruzionichel'attaccantevuolepiazzarenellaposizioneEIPsalvataeleprecedentiAsonosolopadperraggiungerel'EIP(ricordachelostacksiriduce)
Dopol'overflow,diciamochelapilaassomigliaaquesta:
A questo punto, l'attaccante ha piazzato con successo il nuovo EIP. Ogni volta che la funzione del callee ritorna, l'istruzione ret
poperà il registro EIP (ora 0x0834FD4C) al registro % eip e il flusso di controllo riprenderà da questo indirizzo di memoria e inizierà ad eseguire le istruzioni che trova lì . Ancora una volta, l'attaccante deve assicurarsi di aver pianificato il codice exploit in questa posizione in anticipo.
Invio post-callee:
EBP : può cambiare o non può cambiare in base a ciò che l'attaccante fornisce nei dati del buffer overflower. Ricorda che dal momento che deve tromp EBP prima che raggiunga EIP, certamente dovrà fornire un valore per EBP pure. Generalmente l'attaccante sarà abbastanza diligente da enumerare lo stack per determinare l'EBP corrente e installarlo nel payload in modo che rimanga lo stesso di prima. Per es. potrebbe (e dovrebbe) fornire qualcosa come:
AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA 082376ED 0834FD4C
Dove 082376ED
è l'EBP esistente. Ciò assicurerà che non venga modificato in un valore arbitrario nella missione per sovrascrivere l'EIP.
EIP : viene modificato nel nuovo valore
ESP : tornerà allo stesso valore indipendentemente dal sovraccarico del buffer o meno.
Quindi, dopo il ritorno della funzione, vivrai nello stack frame del vecchio chiamante, ma eseguirai un altro codice.
Smashing the Stack for Fun and Profit è un'ottima fonte per ulteriori informazioni.