ChronoPay
- 1 year ago
- 0
- 0
В информатике NOP или NOOP (сокращение от английского: « N o OP eration») инструкция процессора на языке ассемблера , или команда протокола , которая предписывает ничего не делать.
Набор команд многих процессоров содержит инструкцию, цель которой состоит не в том, чтобы изменить состояние какого-либо регистра или ячейки памяти , а в том чтобы затратить определённое число тактов процессора. Для тех процессоров, в которых специальная инструкция отсутствует, NOP имитируется какой-то другой инструкцией с такими параметрами, что никакие действия не производятся (регистры и флаги не меняются). Например, в SPARC -процессорах в качестве NOP рекомендуется инструкция " sethi 0, %g0 "). В архитектуре x86 команда NOP кодируется одним байтом 90h, в микропроцессоре Z80 — байтом 00h.
NOP’ы обычно используются:
Инструкция для x86 -совместимых процессоров (фирм Intel , AMD и др.):
NOP
0x
90
На самом деле, инструкция NOP для x86-процессоров эквивалентна XCHG EAX,EAX (или XCHG AX,AX в
реальном режиме
), которая имеет тот же опкод
0x
90
и не производит никакого эффекта, за исключением следующих специальных случаев:
0x
F3
0x
90
) в процессорах, начиная с
Xeon
и
Pentium 4
, интерпретируется как команда PAUSE, сообщая процессору, что программа выполняет цикл ожидания изменения другими процессорами состояния ячейки памяти, что позволяет процессору оптимизировать работу с памятью и энергопотребление.
«Дорожка NOP’ов» или «трамплин NOP’ов» — известный хакерский приём, связанный с исполнением произвольного кода .
Наиболее распространённая причина исполнения произвольного кода — переполнение буфера . Впрочем, зачастую адрес, который запишется вместо точки возврата, известен лишь приблизительно. В таком случае создаётся такой код.
nop
nop
...
nop
nop
;тут вредоносный код
Перейдя на любой из NOP’ов, процессор в конце концов «скатится» на вредоносный участок.
Cуществуют различные варианты байтовых наборов, при исполнении которых процессор ничего не делает — «длинные» аналоги команды NOP. Простейший двухбайтовый вариант NOP в 32-разрядной архитектуре x86 — команда XCHG AX,AX с машинным кодом 6690h. От обычной (однобайтовой) команды NOP отличается префиксом изменения разрядности операнда. Например, в среде Delphi для выравнивания размеров процедур и функций по границам двойного слова используются инструкции NOP (1 байт 90h), MOV EAX,EAX (2 байта 89C0h) или LEA EAX,[EAX+0] (3 байта 8D4000h). Другие «длинные» варианты команды NOP (они далеко не единственно возможные), начиная с длины 3 байта, приведены ниже:
В качестве примеров команды размером 4 байта, которая ничего не делает, можно также привести команду LEA SI,[SI] (машинный код 67668D34h) или команду MOVSX AX,AX (машинный код 660FBFC0h).
Многие протоколы, например telnet , содержат NOP-команду, которую клиент может отправить, чтобы получить ответ от сервера без выполнения каких-либо других действий. Команда NOOP присутствует в следующих наиболее известных протоколах:
Возможные применения команде NOP: