Thông thường thời gian NOP
được sử dụng để sắp xếp các địa chỉ hướng dẫn. Điều này thường gặp phải, ví dụ khi viết Shellcode để khai thác lỗi tràn bộ đệm hoặc định dạng lỗ hổng chuỗi .
Giả sử bạn có một bước nhảy tương đối lên 100 byte về phía trước và thực hiện một số sửa đổi cho mã. Cơ hội là các sửa đổi của bạn làm rối tung địa chỉ của mục tiêu nhảy và do đó, bạn cũng phải thay đổi bước nhảy tương đối đã nói ở trên. Tại đây, bạn có thể thêm NOP
s để đẩy địa chỉ đích về phía trước. Nếu bạn có nhiều NOP
s giữa địa chỉ đích và lệnh nhảy, bạn có thể xóa NOP
s để kéo địa chỉ đích về phía sau.
Điều này sẽ không thành vấn đề nếu bạn đang làm việc với trình biên dịch chương trình hỗ trợ nhãn. Bạn có thể chỉ cần làm JXX someLabel
(trong đó JXX là một số bước nhảy có điều kiện) và trình biên dịch sẽ thay thế someLabel
bằng địa chỉ của nhãn đó. Tuy nhiên, nếu bạn chỉ cần sửa đổi mã máy đã lắp ráp (opcodes thực tế) bằng tay (vì đôi khi xảy ra với việc viết shellcode), bạn cũng phải thay đổi lệnh nhảy bằng tay. Hoặc bạn sửa đổi nó, hoặc sau đó di chuyển địa chỉ mã đích bằng cách sử dụng NOP
s.
Một trường hợp sử dụng khác cho NOP
hướng dẫn sẽ là một cái gì đó gọi là NOP sled . Về bản chất, ý tưởng là tạo ra một mảng hướng dẫn đủ lớn, không gây ra tác dụng phụ (nhưNOP
hoặc tăng và sau đó giảm một thanh ghi) nhưng tăng con trỏ lệnh. Điều này hữu ích, ví dụ khi một người muốn chuyển đến một đoạn mã nhất định mà địa chỉ không được biết đến. Bí quyết là đặt NOP đã nói trượt trước mã mục tiêu và sau đó nhảy đến một nơi nào đó để trượt. Điều xảy ra là việc thực thi tiếp tục hy vọng từ mảng không có tác dụng phụ và nó đi qua hướng dẫn cho mỗi lệnh cho đến khi nó chạm vào đoạn mã mong muốn. Kỹ thuật này thường được sử dụng trong các khai thác tràn bộ đệm nói trên và đặc biệt là để chống lại các biện pháp bảo mật như ASLR .
Tuy nhiên, một cách sử dụng cụ thể khác cho NOP
hướng dẫn là khi một người đang sửa đổi mã của một số chương trình. Ví dụ, bạn có thể thay thế các phần của bước nhảy có điều kiện bằng NOP
s và như vậy tránh được điều kiện. Đây là phương pháp thường được sử dụng khi " bẻ khóa " bảo vệ bản sao phần mềm. Đơn giản nhất, đó chỉ là về việc loại bỏ cấu trúc mã lắp ráp cho if(genuineCopy) ...
dòng mã và thay thế các hướng dẫn bằng NOP
s và .. Voilà! Không có kiểm tra được thực hiện và bản sao không chính hãng hoạt động!
Lưu ý rằng về bản chất cả hai ví dụ về shellcode và crack đều làm như nhau; sửa đổi mã hiện có mà không cập nhật địa chỉ tương đối của các hoạt động dựa trên địa chỉ tương đối.