Nel codice assembly, NOP è l'abbreviazione di No OPeration. Questo è più noto per i chip x86 come 0x90
. Quando un processore carica quella istruzione, semplicemente non fa nulla (almeno utile) per l'unico ciclo e poi fa avanzare il registro all'istruzione successiva.
NOPs keep the payload sizes consistent
... assicurando che qualsiasi spazio non utilizzato da altro codice sarà comunque validamente eseguibile dal processore senza effetti collaterali. Questa " slitta NOP " è anche la fonte di nomi umoristici come i vincitori del DEFCON 19 CTF Team Nopsled europeo .
L'importanza pratica di questo ha a che fare con l'istruzione di scrittura salta . I salti possono essere di salto relativo (leggere la memoria 8 byte prima di dove ci si trova ora) o di un salto assoluto (leggere la memoria che si trova nella posizione 0x874710). Se si spostano i dati con un salto assoluto, è necessario ricodificare qualsiasi riferimento ad essi. Se si sposta un'istruzione in giro rispetto a un'altra, è necessario anche ricodificare i salti relativi. Mettere NOPs semplifica il problema perché un salto che finisce in una serie di NOP continuerà con la prima istruzione eseguibile e impedirà al processore di leggere un codice non valido che fermerebbe l'esecuzione e manderà in crash il software.
Molto spesso, se sai che il puntatore per lo stack punterà da qualche parte in un intervallo continuo di indirizzi di memoria, lo riempirai con NOP e poi inserirai il tuo codice.
Dai un'occhiata a questo tutorial per la scrittura di shellcode che spiega quando utilizza i NOP per ottenere una migliore comprensione.