Открыть сервис

NOP-слайд

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

История

Концепция NOP-слайда возникла в конце 1980-х — начале 1990-х годов в контексте первых эксплойтов для переполнения буфера. Одним из ранних примеров использования является атака, описанная в 1995 году в статье «Smashing The Stack For Fun And Profit» (Элиас Леви, известный как Aleph One). В ней автор продемонстрировал, как с помощью NOP-слайда можно значительно увеличить вероятность успешного выполнения шеллкода при неопределённом адресе возврата.

До появления NOP-слайдов атакующим требовалось точно знать адрес, по которому будет расположен шеллкод. В условиях рандомизации стека (ASLR, внедрённой в Linux в 2001 году, а в Windows — в 2003 году) точное попадание стало практически невозможным. NOP-слайд позволил атаковать не одну точку, а целый диапазон адресов, что сделало эксплойты более устойчивыми.

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

Механизм

NOP-слайд — это непрерывный блок памяти, заполненный инструкциями, которые не изменяют состояние программы (регистры, флаги, память). Наиболее распространённая инструкция — однобайтовый NOP (0x90 в архитектуре x86). Однако для обхода сигнатурных антивирусных систем могут использоваться многобайтовые эквиваленты, например:

  • 0x90 — NOP (1 байт)
  • 0x87 0xC0 — XCHG EAX, EAX (2 байта, не изменяет значения)
  • 0x66 0x90 — NOP с префиксом (2 байта)
  • 0x0F 0x1F 0x00 — NOP с тремя байтами (3 байта)

В архитектуре ARM для NOP-слайдов часто используют инструкцию MOV R0, R0 (0xE1A00000) или NOP (0xE320F000).

Атака

  1. Атакующий создаёт буфер, содержащий NOP-слайд, за которым следует шеллкод.
  2. Буфер передаётся уязвимой программе (например, через переполнение буфера в стеке).
  3. Атакующий перезаписывает адрес возврата на любой адрес, указывающий на область NOP-слайда.
  4. После возврата из функции процессор начинает выполнение с произвольного адреса внутри слайда.
  5. Выполняются NOP-инструкции, пока не будет достигнут шеллкод.
  6. Шеллкод выполняется, предоставляя атакующему контроль над системой.

Размер и эффективность

Размер NOP-слайда варьируется от нескольких десятков до нескольких тысяч байт. Чем больше слайд, тем выше вероятность, что случайный адрес попадёт в него. Однако слишком большой слайд может быть обнаружен системами обнаружения вторжений (IDS) или антивирусами, которые ищут длинные последовательности 0x90. Для противодействия этому применяются:

  • Полиморфные NOP-слайды — использование разных инструкций, не изменяющих состояние.
  • Слайды с переменной длиной и случайным порядком байтов.
  • Использование инструкций, которые выполняют полезные действия, но не влияют на выполнение шеллкода (например, INC EAX с последующим DEC EAX).

Применение

Эксплойты для переполнения буфера

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

Обход ASLR

ASLR (Address Space Layout Randomization) — механизм, рандомизирующий расположение стека, кучи и библиотек в памяти. NOP-слайд не устраняет ASLR, но делает его менее эффективным: если атакующий может угадать адрес с точностью до размера слайда, атака становится возможной. Например, при размере слайда 256 байт и рандомизации стека с шагом 4096 байт вероятность успешного попадания может достигать 6,25% (при одной попытке). При многократных попытках (например, через повторный запуск программы) вероятность возрастает.

Атаки на heap (кучу)

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

Вредоносное ПО и шеллкоды

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

Методы защиты

Обнаружение NOP-слайдов

Системы обнаружения вторжений (IDS) и антивирусы ищут длинные последовательности 0x90 или их вариации. Однако полиморфные слайды усложняют сигнатурное обнаружение.

DEP (Data Execution Prevention)

DEP (аппаратная защита от выполнения данных) запрещает выполнение кода в областях памяти, помеченных как данные (например, стек, куча). NOP-слайд в таких областях не будет выполнен, что делает атаку неэффективной. Однако атакующие могут использовать ROP (Return-Oriented Programming) для обхода DEP, где NOP-слайды заменяются на цепочки гаджетов.

ASLR с высоким энтропийным пространством

Современные реализации ASLR (например, в Windows 10/11, Linux с ядром 5.x) используют большую степень рандомизации (до 64 бит), что делает угадывание адреса даже с большим NOP-слайдом практически невозможным. Однако ASLR может быть обойдён через утечку адресов (information leak).

Stack Canary (канарейки)

Стековые канарейки — случайные значения, помещаемые в стек перед адресом возврата. При переполнении буфера канарейка обычно перезаписывается, и перед возвратом из функции её значение проверяется. Если оно изменилось, программа аварийно завершается. NOP-слайд не помогает обойти канарейку, так как она проверяется до выполнения слайда.

Контроль целостности потока выполнения (CFG)

Control Flow Guard (CFG) в Windows и другие технологии ограничивают адреса, на которые можно передать управление. NOP-слайд в стеке или куче не будет разрешён как целевой адрес, что предотвращает атаку.

Примеры

Классический эксплойт для x86

```asm ; Буфер размером 512 байт ; NOP-слайд: 300 байт ; Шеллкод: 200 байт ; Адрес возврата: 0x7ffffff0 (приблизительный адрес стека)

; Заполнение буфера: ; 1. NOP-слайд (0x90 * 300) ; 2. Шеллкод (200 байт) ; 3. Адрес возврата (4 байта) — указывает на середину NOP-слайда ```

Полиморфный NOP-слайд (x86)

``asm ; Пример последовательности, не содержащей 0x90 0x87 0xC0 ; XCHG EAX, EAX 0x66 0x90 ; NOP (2 байта) 0x0F 0x1F 0x00 ; NOP (3 байта) 0x87 0xC0 ; XCHG EAX, EAX 0x66 0x90 ; NOP (2 байта) ; ... повторение ``

Критика

NOP-слайды критикуются за то, что они являются индикатором вредоносной активности и легко обнаруживаются современными средствами защиты. Кроме того, их эффективность снижается с развитием механизмов защиты, таких как DEP, ASLR и CFG. В современных атаках NOP-слайды часто заменяются на более сложные техники, такие как ROP, JOP (Jump-Oriented Programming) или использование утечек информации.

Источники

  • Aleph One. «Smashing The Stack For Fun And Profit». Phrack Magazine, 1995.
  • Koziol, J. et al. «The Shellcoder’s Handbook: Discovering and Exploiting Security Holes». Wiley, 2004.
  • «Buffer Overflow Attacks: Detect, Exploit, Prevent». Syngress, 2004.
  • Microsoft. «Data Execution Prevention (DEP)». Документация Windows, 2003.
  • «Address Space Layout Randomization (ASLR)». Linux Kernel Documentation, 2001.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →