Il motivo per cui inserisci lo shellcode prima dell'indirizzo di ritorno nel tuo sfruttamento dell'overflow del buffer dipende da alcuni fattori:
- La dimensione del buffer
- Il flusso dell'applicazione
- Qualsiasi trucco oltre un semplice buffer + indirizzo di ritorno come dover fare salti relativi richiederà un po 'di finezza
Un esempio comune di overflow del buffer può essere simile a questo:
"\x41"*1000 + "\xe7\x51\x78\xa2" + "\x90"*16 + "[shellcode]"
Qui, ho inondato il buffer con 1000 A di, è atterrato in un posto dove posso controllare EIP per puntare a una posizione di mia scelta, seguita da alcuni PON per dare la mia stanza shellcode per disfare, e quindi in ultima analisi, il codice eseguibile . Questo è un exploit relativamente semplice. L'indirizzo di ritorno sarebbe normalmente un'istruzione ESP JMP, che si trova all'inizio della slitta NOP. La slitta funziona finché non colpisce lo shellcode e, poiché lo stack cresce, sovrascrive la slitta del NOP mentre si scompatta e si ottiene l'esecuzione.
Tuttavia, a volte non hai quel tipo di percorso di exploit e devi fare qualcosa di diverso:
"\x90"*16 + [shellcode] + "\x90"*400 + [return address] + "\x90"*5
Qui dobbiamo inserire il nostro shellcode all'inizio perché un semplice ESP di JMP non è possibile. Invece, dobbiamo trovare un'altra istruzione che ci permetta di saltare all'inizio per ottenere l'esecuzione. Poi abbiamo un po 'di padding alle due estremità dell'indirizzo di ritorno.
Quindi la risposta, senza ulteriori dettagli, è "dipende". Dipende dalla situazione specifica, da ciò con cui devi lavorare nel tuo exploit, dalla stanza che hai e dal comportamento dell'applicazione in questione.