Часто время NOP
используется для выравнивания адресов команд. Это обычно встречается, например, при написании Shellcode для использования уязвимости переполнения буфера или форматной строки .
Скажем, у вас есть относительный переход на 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 и .. Вуаля! Никакие проверки не сделаны, и не подлинная копия работает!
Обратите внимание, что по сути оба примера шелл-кода и взлома делают одно и то же; изменить существующий код без обновления относительных адресов операций, которые основаны на относительной адресации.