Quando si sommerge un buffer per scrivere sullo stack in un modo che è sfruttabile, si sovrascriverà l'indirizzo di ritorno nello stack. Ad esempio, l'invio di una stringa lunga di AAAAAAAAAAAAAAAAAAAAAAAAAAA.....AAAAAAAAA
comporterà EIP
contenente il valore 0x41414141
quando l'applicazione si arresta in modo anomalo.
Le ragioni di ciò sono ben documentate in molti luoghi su Internet. Aleph1 sta distruggendo lo stack per divertimento e profitto o I tutorial di Corelan sono ottimi posti per leggere più informazioni, ma per la domanda a portata di mano .
Pur avendo il controllo di EIP
è grandioso, non porta immediatamente al codice in esecuzione di tua scelta. Quando l'epilogo della funzione apre l'indirizzo di ritorno dello stack, continuerà a eseguire le istruzioni in quella posizione di memoria. Quindi dovrai fornire un valore diverso da 0x41414141
. Il primo problema è che non sai quale 4% diA
nella tua stringa sia quello che si trova in EIP
. Questa distanza dal primo A al 4 A che sovrascrive EIP
viene comunemente chiamata offset. Puoi elaborarlo manualmente scambiando tra i valori suc come AAAABBBBCCCCDDDD....etc
oppure puoi utilizzare uno dei generatori di schemi in grado di calcolare l'offset per te.
Una volta che conosci l'offset puoi hardcode l'indirizzo in cui il codice shell dovrebbe sedersi nello stack (più facile per i principianti) o trovare un gadget che ti ricollerà nello stack dove è il tuo codice shell (es: jmp esp
) e scrivere quella posizione di memoria su EIP
.