Часто NOP
для вирівнювання адрес інструкцій використовується час. Зазвичай це трапляється, наприклад, при написанні коду Shell для використання переповнення буфера або вразливості рядка формату .
Скажімо, у вас є відносний стрибок на 100 байт вперед і внесіть деякі зміни в код. Цілком ймовірно, що ваші модифікації зіпсують адресу цілі стрибка, і, таким чином, вам доведеться також змінити вищезгаданий відносний стрибок. Тут ви можете додати NOP
s, щоб просунути цільову адресу вперед. Якщо у вас є декілька NOP
s між цільовою адресою та інструкцією про стрибок, ви можете видалити NOP
s, щоб тягнути цільову адресу назад.
Це не буде проблемою, якщо ви працюєте з асемблером, який підтримує мітки. Ви можете просто зробити JXX someLabel
(де JXX - деякий умовний стрибок), і асемблер замінить someLabel
адресу цієї мітки. Однак якщо ви просто модифікуєте зібраний машинний код (фактичні опкоди) вручну (як це буває при написанні коду оболонки), вам також доведеться змінити інструкцію переходу вручну. Або ви модифікуєте його, або переміщуєте цільову кодову адресу за допомогою NOP
s.
Іншим випадком використання для NOP
навчання буде щось, що називається санком NOP . По суті, ідея полягає у створенні достатньо великого масиву інструкцій, які не викликають побічних ефектів (наприклад,NOP
або збільшити, а потім зменшити регістр), але збільшити покажчик інструкцій. Це корисно, наприклад, коли потрібно перейти до певного коду, адреса якого не відома. Трюк полягає в тому, щоб розташувати вказану сани NOP перед кодом цілі, а потім стрибнути кудись до вказаних саней. Що стається, це те, що виконання триває, сподіваємось, з масиву, який не має побічних ефектів, і він переходить вперед інструкцію за інструкцією, поки не потрапить на потрібний фрагмент коду. Ця методика зазвичай використовується у вищезгаданих подвигах переповнення буфера і особливо для протидії заходам безпеки, таким як ASLR .
Ще одне особливе використання для NOP
інструкції - це коли видозмінюєте код якоїсь програми. Наприклад, ви можете замінити частини умовних стрибків на NOP
s і як таке обійти умову. Це часто застосовуваний метод, коли " розтріскується " захист від копіювання програмного забезпечення. Найпростіше, це просто зняти конструкцію коду складання if(genuineCopy) ...
рядка коду та замінити інструкції на NOP
s та .. Voilà! Жодних перевірок не робиться і неістинна копія працює!
Зауважте, що по суті обидва приклади shellcode і розтріскування роблять те саме; змінити існуючий код без оновлення відносних адрес операцій, які покладаються на відносну адресацію.