Perché dobbiamo inserire lo shellcode prima dell'indirizzo di ritorno nel buffer overflow?

2

Vorrei sapere perché dobbiamo inserire lo shellcode prima dell'indirizzo di ritorno in un buffer overflow. Logicamente l'indirizzo di ritorno punta al codice shell e verrà eseguito, quindi l'indirizzo di ritorno deve essere inserito prima dello shellcode. Qualcuno può spiegarmi?

    
posta Scoobydoo 26.09.2015 - 20:58
fonte

2 risposte

2

L'overflow del buffer, per definizione, deve superare il buffer. Questo è per sovrascrivere l'indirizzo di ritorno alla fine.

Ciò fornisce una posizione comoda in cui rilasciare il codice shell. Se si è tentato di aggiungerlo in seguito, è possibile sovrascrivere un altro indirizzo di memoria e quindi il programma si bloccherebbe in un modo diverso.

Quindi aggiungendo il codice shell prima che l'indirizzo di ritorno permetta di scrivere l'indirizzo di ritorno per attivare un salto al codice shell precedentemente scritto. Per riassumere, il buffer che stai traboccando è spesso la posizione perfetta per scrivere il tuo codice shell senza sovrascrivere un altro importante frammento di memoria.

    
risposta data 26.09.2015 - 23:42
fonte
2

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.

    
risposta data 27.09.2015 - 00:07
fonte

Leggi altre domande sui tag