Sering kali NOPdigunakan untuk menyelaraskan alamat instruksi. Ini biasanya ditemui misalnya ketika menulis Shellcode untuk mengeksploitasi buffer overflow atau kerentanan format string .
Katakanlah Anda memiliki lompatan relatif ke 100 byte ke depan, dan buat beberapa modifikasi pada kode. Kemungkinannya adalah modifikasi Anda mengacaukan alamat target lompatan dan karenanya Anda juga harus mengubah lompatan relatif tersebut. Di sini, Anda dapat menambahkan NOPs untuk mendorong alamat target ke depan. Jika Anda memiliki beberapa NOPs antara alamat target dan instruksi lompat, Anda dapat menghapus NOPs untuk menarik mundur alamat target.
Ini tidak akan menjadi masalah jika Anda bekerja dengan assembler yang mendukung label. Anda dapat melakukannya JXX someLabel(di mana JXX merupakan lompatan bersyarat) dan assembler akan mengganti someLabeldengan alamat label tersebut. Namun, jika Anda cukup memodifikasi kode mesin rakitan (opcodes aktual) dengan tangan (seperti yang kadang-kadang terjadi dengan menulis shellcode), Anda juga harus mengubah instruksi lompat secara manual. Anda dapat memodifikasinya, atau memindahkan alamat kode target dengan menggunakan NOPs.
Kasus penggunaan lain untuk NOPinstruksi adalah sesuatu yang disebut kereta luncur NOP . Intinya idenya adalah untuk membuat array instruksi yang cukup besar yang tidak menimbulkan efek samping (sepertiNOPatau menambah dan kemudian mengurangi register) tetapi menambah penunjuk instruksi. Ini berguna misalnya ketika seseorang ingin melompat ke bagian kode tertentu yang alamatnya tidak diketahui. Caranya adalah dengan menempatkan kereta luncur NOP di depan kode target dan kemudian melompat ke suatu tempat ke kereta luncur tersebut. Apa yang terjadi adalah bahwa eksekusi berlanjut dengan harapan dari array yang tidak memiliki efek samping dan ia akan meneruskan instruksi-per-instruksi hingga menyentuh bagian kode yang diinginkan. Teknik ini biasanya digunakan dalam eksploitasi buffer overflow yang disebutkan di atas dan terutama untuk melawan langkah-langkah keamanan seperti ASLR .
Namun penggunaan khusus lain untuk NOPinstruksi adalah ketika seseorang memodifikasi kode dari beberapa program. Misalnya, Anda dapat mengganti bagian dari lompatan bersyarat dengan NOPs dan dengan demikian menghindari kondisi tersebut. Ini adalah metode yang sering digunakan ketika " memecahkan " perlindungan salinan perangkat lunak. Paling sederhana itu hanya tentang menghapus konstruksi kode perakitan untuk if(genuineCopy) ...baris kode dan mengganti instruksi dengan NOPs dan .. Voa! Tidak ada pemeriksaan yang dilakukan dan salinan yang tidak asli berfungsi!
Perhatikan bahwa pada dasarnya kedua contoh shellcode dan cracking melakukan hal yang sama; memodifikasi kode yang ada tanpa memperbarui alamat relatif operasi yang bergantung pada pengalamatan relatif.