NOP (No OPeration) è un'istruzione assembly, il cui scopo è quello di permettere all'unità di esecuzione della pipeline di oziare per N cicli di clock (dove N cambia a seconda del processore utilizzato), come deducibile dal nome dunque, non esegue alcuna operazione.

Analisi dell'istruzione NOP

modifica

La maggior parte degli instruction set adottati dalle maggiori CPU, includono un'istruzione che non fa sostanzialmente nulla per N cicli di clock senza comportare alcun cambiamento nei registri del data path.

Caratteristiche di tale istruzione nelle architetture x86:

Caratteristiche nell'architettura ARM:

  • sintassi: NOP
  • Cicli di clock: 1
  • Lunghezza: 4 bytes
  • Opcode: 0x00000000

Programmazione

modifica

L'istruzione NOP occupa dunque tempo e memoria, ma ha una sua utilità nel mondo della programmazione (oltre che alla creazione di ritardi convenzionali e di riserve di spazio in memoria), risolvendo alcuni problemi chiamati "hazard", ovvero quei tipi di conflitti ed incongruenze che possono avvenire all'interno di una pipeline durante l'esecuzione del programma. L'istruzione può anche essere utilizzata per risolvere i problemi della branch delay slot in modo poco efficiente.

Nella modifica di codice eseguibile l'istruzione NOP può essere utilizzata per eliminare istruzioni non gradite sostituendole/ricoprendole di NOP. In questo caso quindi l'istruzione potrebbe essere utilizzata sia per debuggare sia per crackare un software.

Hacking/Cracking

modifica

Overflows (NOD)

modifica

Nell'exploiting dei maggiori casi di stack e heap overflow, ci troviamo davanti ad uno standard di shellcode che vede il buffer organizzato in questo modo:

 Opcode della Funzione [ex. execve()]  Indirizzo di ritorno (ripetuto)
[---------------40bytes-------------][------------60bytes-------------]

Nello scenario sovrastante chi effettua l'attacco è obbligato a conoscere l'esatta posizione in memoria dello shellcode che si vuol fare eseguire al programma.

Riempiendo di NOP uno spazio X prima del nostro shellcode, e facendo ritornare la funzione in un punto a caso della memoria dove risiede uno dei nostri NOP, il processore eseguirà ogni istruzione da quel punto, sino ad arrivare al nostro shellcode. Questa operazione viene chiamata NOD o NOP Sled.

 Nop Sled (NOD)  Opcode della Funzione [ex. execve()]  Indirizzo di ritorno (ripetuto)
[---100bytes---][---------------40bytes-------------][------------60bytes-------------]

In contrasto alla comodità tratta dall'impiego di questo metodo, vi è da considerare che il nostro shellcode sarà riconoscibile da qualsiasi sistema IDS che prevede la protezione da attacchi di tipo analogo.

Il NOD inserito in uno shellcode appare così: /x90/x90/x90/x90/x90/x90/x90/x90/x90/x90[...]

  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica