2013-02-07 9 views
52

Mi sono spaccato la testa e non riesco a trovare una buona fonte che risponda a questa domanda. So che una nop sled è una tecnica utilizzata per aggirare la randomizzazione dello stack in un attacco di overflow del buffer, ma non riesco a capire come funziona.Come funziona una slitta NOP?

Qual è un semplice esempio che illustra questo metodo?

Che cosa significano termini come nop di 128 byte?

+0

chiediti quali sono le applicazioni pratiche per le quali hai intenzione di imparare a fare questo? –

+6

Sono un laureando della CE e sto imparando questo argomento nel Bryant, il manuale di O'Hallaron CS: APP. Lavoro anche per la sicurezza informatica nel mio college, quindi questo mi interessa. – amorimluc

+4

Ecco cosa direbbe un ingegnere sociale! ;) – DeepS1X

risposta

64

Alcuni attacchi consistono nel far passare il programma a un indirizzo specifico e continuare a correre da lì. Il codice iniettato deve essere precedentemente caricato in qualche modo in quella posizione esatta.

La randomizzazione dello stack e altre differenze di runtime possono rendere impossibile la previsione dell'indirizzo in cui il programma salterà, così l'attaccante posiziona una slitta NOP in una vasta gamma di memoria. Se il programma salta ovunque nella slitta, eseguirà tutti i NOP rimanenti, non facendo nulla e quindi eseguirà il codice del payload, proprio accanto alla slitta.

Il motivo per cui l'utente malintenzionato utilizza la slitta NOP è quello di ingrandire l'indirizzo di destinazione: il codice può saltare ovunque nella slitta, invece che esattamente all'inizio del codice inserito.

Una slitta NOP a 128 byte è solo un gruppo di istruzioni NOP a 128 byte di larghezza.

NOTA N. 1: NOP (No-OPeration) è un'istruzione disponibile nella maggior parte delle architetture (tutte?) Che non fa altro che occupare memoria e alcuni runtime.

NOTA n. 2: in architetture con istruzioni di lunghezza variabile, un'istruzione NOP di solito è lunga solo un byte, quindi può essere utilizzata come comodo riempimento delle istruzioni. Sfortunatamente, anche questo rende facile fare una slitta NOP.

+0

Ok, penso di avere l'essenza di nop-slitte. C'è un punto in cui potresti indicare che mostra un esempio di codice assembly di una slitta di nop? – amorimluc

+0

Nop-sled sono ancora un po 'astratto per me. Un esempio potrebbe davvero aiutare. – amorimluc

+10

@amorimluc Questo esempio esiste, ma diventa davvero noioso dopo la riga 15 o così ... –

0

Poiché non posso commentare, aggiungere alla spiegazione di rodrigo. Anche con una slitta NOP, la posizione approssimativa del buffer in memoria deve essere prevista in anticipo. Una tecnica per approssimare la posizione della memoria è usare la posizione dello stack nelle vicinanze come una cornice di riferimento. Sottraendo un offset da questa posizione, è possibile ottenere l'indirizzo relativo di qualsiasi variabile.

Nota a margine: su architettura x86 l'istruzione NOP è equivalente alla 0x90 esadecimale byte quindi completato exploit buffer potrebbe essere simile a questa:

| Slitta NOP | Shellcode | Indirizzo di ritorno ripetuto |

Visto che se i punti di registro EIP a qualsiasi indirizzo trovato nel NOP sled, sarebbe incrementare durante l'esecuzione di ogni istruzione NOP, uno alla volta, fino a raggiungere finalmente lo shellcode

-1

Nel contesto di Linux e c, sono sicuro che '0x90' è un bit importante di informazioni riguardanti una slitta NOP. I libri sullo sfruttamento del kernel dovrebbero essere utili!

+0

0x90 è l'opcode x86 per un NOP a byte singolo. Su altre architetture su cui Linux e C lavorano, NOP è un diverso pattern di bit. –

Problemi correlati