บ่อยครั้งที่NOP
ใช้เพื่อจัดตำแหน่งที่อยู่คำสั่ง นี้มักจะพบตัวอย่างเช่นเมื่อเขียนShellcodeจะใช้ประโยชน์จากหน่วยความจำล้นหรือช่องโหว่สตริงรูปแบบ
สมมติว่าคุณมีการข้ามแบบสัมพัทธ์จนถึง 100 ไบต์และทำการแก้ไขโค้ด โอกาสที่จะเกิดขึ้นคือการปรับเปลี่ยนที่อยู่ของเป้าหมายกระโดดและทำให้คุณต้องเปลี่ยนการกระโดดที่สัมพันธ์กันดังกล่าวข้างต้น ที่นี่คุณสามารถเพิ่มNOP
s เพื่อผลักที่อยู่เป้าหมายไปข้างหน้า หากคุณมีหลายNOP
s ระหว่างที่อยู่เป้าหมายและคำสั่งการกระโดดคุณสามารถลบNOP
s เพื่อดึงที่อยู่เป้าหมายไปด้านหลัง
สิ่งนี้จะไม่เป็นปัญหาหากคุณทำงานกับแอสเซมเบลอร์ที่รองรับฉลาก คุณสามารถทำได้JXX someLabel
(โดยที่ JXX มีการกระโดดแบบมีเงื่อนไข) และแอสเซมเบลอร์จะแทนที่someLabel
ด้วยที่อยู่ของป้ายกำกับนั้น อย่างไรก็ตามหากคุณเพียงแค่แก้ไขรหัสเครื่องประกอบ (opcodes จริง) ด้วยมือ (เพราะบางครั้งมันเกิดขึ้นกับการเขียน shellcode) คุณต้องเปลี่ยนคำสั่งการกระโดดด้วยตนเอง ไม่ว่าคุณจะปรับเปลี่ยนหรือย้ายที่อยู่รหัสเป้าหมายโดยใช้NOP
s
อีกกรณีใช้สำหรับNOP
การเรียนการสอนจะเป็นสิ่งที่เรียกว่านพเลื่อน ในสาระสำคัญความคิดคือการสร้างชุดคำสั่งจำนวนมากพอที่ทำให้ไม่มีผลข้างเคียง (เช่นNOP
หรือเพิ่มค่าจากนั้นลดค่าลงทะเบียน) แต่เพิ่มตัวชี้คำสั่ง สิ่งนี้มีประโยชน์เช่นเมื่อต้องการข้ามไปยังโค้ดบางส่วนซึ่งไม่ทราบที่อยู่ เคล็ดลับคือการวาง NOP ดังกล่าวไว้ข้างหน้ารหัสเป้าหมายแล้วกระโดดไปที่ที่ลากเลื่อนดังกล่าว สิ่งที่เกิดขึ้นคือการประมวลผลยังคงดำเนินต่อไปอย่างหวังว่าจากอาเรย์ที่ไม่มีผลข้างเคียงและจะส่งต่อคำแนะนำต่อการเรียนการสอนจนกว่าจะพบรหัสที่ต้องการ เทคนิคนี้เป็นที่นิยมใช้ในการหาประโยชน์ดังกล่าวหน่วยความจำล้นและโดยเฉพาะอย่างยิ่งมาตรการรักษาความปลอดภัยที่เคาน์เตอร์เช่นASLR
อีกประการหนึ่งที่ใช้สำหรับการNOP
เรียนการสอนคือเมื่อมีการปรับเปลี่ยนรหัสของบางโปรแกรม ตัวอย่างเช่นคุณสามารถแทนที่ส่วนของเงื่อนไขการกระโดดด้วยNOP
s และหลีกเลี่ยงเงื่อนไขดังกล่าว นี้เป็นวิธีที่มักใช้เมื่อ " แตก " ป้องกันการคัดลอกซอฟแวร์ ที่ง่ายที่สุดมันเป็นเพียงการลบการสร้างรหัสประกอบสำหรับif(genuineCopy) ...
บรรทัดของรหัสและแทนที่คำแนะนำด้วยNOP
s และ .. Voilà! ไม่มีการตรวจสอบและทำสำเนาที่ไม่ใช่ของแท้!
โปรดสังเกตว่าในสาระสำคัญทั้งตัวอย่างของ shellcode และแคร็กทำได้เหมือนกัน แก้ไขโค้ดที่มีอยู่โดยไม่ต้องอัปเดตที่อยู่สัมพัทธ์ของการดำเนินการซึ่งขึ้นอยู่กับที่อยู่ญาติ