Sering kali NOP
digunakan 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 NOP
s untuk mendorong alamat target ke depan. Jika Anda memiliki beberapa NOP
s antara alamat target dan instruksi lompat, Anda dapat menghapus NOP
s 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 someLabel
dengan 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 NOP
s.
Kasus penggunaan lain untuk NOP
instruksi adalah sesuatu yang disebut kereta luncur NOP . Intinya idenya adalah untuk membuat array instruksi yang cukup besar yang tidak menimbulkan efek samping (sepertiNOP
atau 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 NOP
instruksi adalah ketika seseorang memodifikasi kode dari beberapa program. Misalnya, Anda dapat mengganti bagian dari lompatan bersyarat dengan NOP
s 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 NOP
s 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.