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).
Атака
- Атакующий создаёт буфер, содержащий NOP-слайд, за которым следует шеллкод.
- Буфер передаётся уязвимой программе (например, через переполнение буфера в стеке).
- Атакующий перезаписывает адрес возврата на любой адрес, указывающий на область NOP-слайда.
- После возврата из функции процессор начинает выполнение с произвольного адреса внутри слайда.
- Выполняются NOP-инструкции, пока не будет достигнут шеллкод.
- Шеллкод выполняется, предоставляя атакующему контроль над системой.
Размер и эффективность
Размер 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 →