NOP slide

NOP slide (NOP-sled, NOP-рампа) — в компьютерной безопасности последовательность инструкций NOP (от англ. no operation — «нет операции»), предназначенная для «скольжения» потока выполнения процессора к целевому адресу выполнения, независимо от того, на какой адрес внутри слайда программа осуществит переход[1].

Этот приём широко используется при создании эксплойтов, где требуется перенаправить выполнение программы при неизвестном точном адресе перехода[2].

История и этимология

Термин имеет метафорическое происхождение и описывает «скольжение» потока выполнения процессора по пустым инструкциям к шеллкоду[1]. Техника была популяризована в 1996 году благодаря статье «Smashing the Stack for Fun and Profit», написанной Aleph One для журнала Phrack[3] .

Принцип работы

NOP-слайд является старейшей и самой известной техникой эксплуатации переполнения буфера стека. Она решает проблему нахождения точного адреса буфера за счёт фактического увеличения области попадания: для этого значительная часть стека заполняется машинной инструкцией NOP, а в конце, после инструкции NOP, злоумышленник размещает инструкцию для перехода (обычно относительного) на начало буфера, где находится шеллкод. Такая последовательность инструкций NOP образует так называемый «NOP-sled»: если возвращаемый адрес будет перезаписан на любой адрес внутри этой области, выполнение будет «скользить» по NOP-инструкциям до перехода к вредоносному коду в конце. Благодаря этому злоумышленнику достаточно угадать область размещения NOP-sled на стеке, а не малогабаритный шеллкод[2].

Этот приём значительно повышает вероятность успешного взлома, однако не лишён недостатков. Эксплойты, использующие NOP slide, всегда предполагают некую вероятность угадать смещение в стеке, попадающее внутрь области NOP-инструкций. Ошибочный выбор адреса приводит к сбою программы и может привлечь внимание администратора. Ещё одна проблема — необходимость значительного размера памяти для размещения эффективного слайда, что невозможно при малом выделенном буфере или малой глубине стека. Несмотря на эти минусы, NOP slide зачастую остаётся единственным вариантом, подходящим для конкретной платформы или ситуации, и потому сохраняет актуальность.

Базовый принцип работы NOP slide идентичен для архитектур x86 и x64: он заключается в создании последовательности инструкций, которые не выполняют значимых операций, а лишь последовательно увеличивают значение счётчика команд (EIP в x86, RIP в x64), пока управление не будет передано шеллкоду. Основные различия между архитектурами заключаются лишь в доступном наборе инструкций[4].[5]

Маскировка и обход обнаружения

Из-за популярности этой техники производители систем предотвращения вторжений (IDS) ищут характерный паттерн NOP-инструкций для обнаружения шеллкода. Однако важно отметить, что NOP-слайд не обязательно состоит только из машинных NOP: любые инструкции, не нарушающие целостности состояния машины настолько, чтобы шеллкод был неработоспособен, могут использоваться как «NOP». В связи с этим распространена практика составления слайдов из случайных инструкций, не влияющих на исполнение шеллкода.

Хотя NOP slide может состоять из стандартных инструкций NOP, наличие прямых последовательностей таких инструкций подозрительно и легко обнаруживается автоматически. Поэтому на практике слайды часто формируются из нестандартных (неканонических) инструкций, функционально эквивалентных NOP (например, копирование регистра в себя самого или сложение с нулём), или из инструкций, несущественно влияющих на состояние программы, что значительно усложняет их идентификацию.

Для обхода сигнатурного анализа IDS применяются различные типы нестандартных инструкций:

  • Официальные многобайтовые NOP: специальные инструкции, поддерживаемые процессорами для выравнивания кода. Они начинаются с опкода `0F 1F` (например, `0F 1F 00`, `0F 1F 40 00`) или используют комбинации вроде `66 90`[4].
  • Неканонические однобайтовые и многобайтовые инструкции: команды, не меняющие состояние программы критичным для эксплойта образом. К ним относятся однобайтовые эквиваленты (например, `xchg eax, eax`, `inc eax` и `dec eax`) и многобайтовые последовательности (например, `push eax; pop eax`, `lea eax, [eax + 0]`)[4].[6]

Энтропия NOP slide зависит от накладываемых ограничений. Если известны регистры, значения которых незначимы (будут переустановлены перед следующим использованием), можно вводить в слайд любые инструкции по их модификации. Если выравнивание слайда и указателя инструкций детерминировано, допускается использование многобайтовых инструкций независимо от возможного невыравненного исполнения. Если же данные, через которые внедряется NOP slide с полезной нагрузкой, фильтруются (например, разрешён только набор печатных символов), набор допустимых инструкций ограничивается. Инструкции архитектурных расширений (например, SSE) часто не влияют на состояние программы, но не могут использоваться в NOP slide на компьютерах без поддержки соответствующего расширения.

Обнаружение

Существует множество методов обнаружения NOP slide в памяти. Например, в 2005 году исследователи из Греции показали, что такие слайды выявляются по длинным последовательностям байт, с любой смещённой точки которых выполнение переходит в одно и то же место.

Современные системы обнаружения (IDS) и предотвращения вторжений (IPS) используют многоуровневый подход для выявления NOP-последовательностей, комбинируя различные методы:[7]

  • Эвристический анализ: включает поведенческий анализ и оценку энтропии участка кода (у классических NOP-слайдов она обычно низкая), а также выявление длинных последовательностей бессмысленных инструкций[8].
  • Машинное обучение: применяются модели, обученные на больших наборах данных, для классификации сетевого трафика и выявления сложных или замаскированных угроз[9].[10]
  • Эмуляция и «песочницы»: подозрительный код исполняется в изолированной среде для анализа его реального поведения и фиксации факта передачи управления вредоносной нагрузке[8].

Механизмы защиты и актуальность

Классическая техника NOP slide стала неэффективной из-за повсеместного внедрения современных механизмов защиты операционных систем и компиляторов. Ключевую роль в снижении актуальности техники сыграли технологии предотвращения выполнения данных (DEP/NX-бит) и рандомизации адресного пространства (ASLR)[11][12][13]. DEP помечает области памяти, такие как стек и куча, как неисполняемые, что приводит к ошибке при попытке выполнить размещённый там NOP-слайд. ASLR случайным образом изменяет адреса ключевых областей памяти при каждом запуске программы, делая практически невозможным предсказание адреса для перехода в область NOP-инструкций.

На уровне компилятора эффективность атак снижается за счёт использования стековых канареек (Stack Canaries)[14][15]. Этот метод заключается в размещении специального значения между локальными переменными и адресом возврата; при попытке переполнения буфера для передачи управления на NOP-слайд канарейка перезаписывается, и программа аварийно завершается после проверки её целостности.

Современные процессоры также включают аппаратные средства защиты, предотвращающие несанкционированную передачу управления. Технология Intel CET использует теневой стек (Shadow Stack) для хранения защищённой копии адресов возврата, прерывая атаку при обнаружении несоответствия с обычным стеком[16]. В архитектуре ARM применяется аутентификация указателей (Pointer Authentication), которая криптографически защищает указатели от модификации, предотвращая переход по изменённому адресу[17].

В современных условиях техника NOP slide считается устаревшей и вытеснена более сложными методами, такими как возвратно-ориентированное программирование (ROP), которые используют уже существующие в памяти исполняемые фрагменты кода для обхода DEP. Тем не менее, NOP-слайд иногда применяется на финальных стадиях в PoC-эксплойтах для повышения их надёжности. Например, подобный подход может использоваться при эксплуатации уязвимости CVE-2023-38408 в OpenSSH, где после получения контроля над указателем инструкций выполнение перенаправляется в область NOP-инструкций перед запуском основного вредоносного кода[18][19].

Примечания

  1. 1 2 NOP slide, NOP sled или NOP ramp. Хабр. Дата обращения: 28 мая 2026.
  2. 1 2 NOP Sled. Unprotect.it. Дата обращения: 28 мая 2026.
  3. Smashing the Stack for Fun and Profit. Speaker Deck. Дата обращения: 28 мая 2026.
  4. 1 2 3 NOP — No Operation. felixcloutier.com. Дата обращения: 28 мая 2026.
  5. Difference between x64 and x86 Architecture. GeeksforGeeks. Дата обращения: 28 мая 2026.
  6. NOPs. ir0nstone.gitbook.io. Дата обращения: 28 мая 2026.
  7. Современные системы IDS/IPS: как они работают и зачем нужны. Nubes. Дата обращения: 28 мая 2026.
  8. 1 2 Что такое эвристический анализ. Kaspersky. Дата обращения: 28 мая 2026.
  9. Как мы обнаруживаем атаки с помощью машинного обучения. Хабр. Дата обращения: 28 мая 2026.
  10. Применение методов машинного обучения для обнаружения атак в режиме реального времени. РусКрипто. Дата обращения: 28 мая 2026.
  11. How Does The ASLR & DEP Security Work. Janbask Training. Дата обращения: 28 мая 2026.
  12. Buffer Overflow Attack: Preventing and Mitigation Methods (Part 2). Wallarm. Дата обращения: 28 мая 2026.
  13. Обход KASLR в Windows: атака на механизм предварительной выборки. Paranoid Security. Дата обращения: 28 мая 2026.
  14. Buffer Overflow Attacks (Slide 13). cs.montana.edu. Дата обращения: 28 мая 2026.
  15. Top 5 Compiler Flags To Prevent Stack Based Attacks. dev.to. Дата обращения: 28 мая 2026.
  16. Control-flow Enforcement Technology (CET). lpc.events. Дата обращения: 28 мая 2026.
  17. Pointer authentication in ARMv8.3. lwn.net. Дата обращения: 28 мая 2026.
  18. CVE-2023-38408 PoC. GitHub. Дата обращения: 28 мая 2026.
  19. Уязвимость CVE-2023-38408: удаленное выполнение кода в OpenSSH через ssh-agent. alekseycheremnykh.ru. Дата обращения: 28 мая 2026.

Литература

  • Vangelis (8 декабря 2004). “Stack-based Overflow Exploit: Introduction to Classical and Advanced Overflow Technique” [англ.]. Wowhacker via Neworder. Архивировано из оригинала 18 августа 2007. Используется устаревший параметр |url-status= (справка)
  • Akritidis, P.; Markatos, Evangelos P.; Polychronakis, M.; Anagnostakis, Kostas D. (2005). “STRIDE: Polymorphic Sled Detection through Instruction Sequence Analysis” (PDF). Proceedings of the 20th IFIP International Information Security Conference (IFIP/SEC 2005) [англ.]. IFIP International Information Security Conference. Архивировано из оригинала (PDF) 1 сентября 2012. Дата обращения 2012-03-04. Используется устаревший параметр |url-status= (справка)
  • STRIDE: Polymorphic Sled Detection Through Instruction Sequence Analysis // Security and Privacy in the Age of Ubiquitous Computing : [англ.]. — 2005. — Vol. 181. — P. 375–391. — ISBN 978-0-387-25658-0. — doi:10.1007/0-387-25660-1_25.

Ссылки