Rust, Хакинг на Rust

Курс — Хакинг на Rust. #29 Продвинутые темы. Обход защиты: Работа с DEP и ASLR

Здравствуйте, дорогие друзья.

Современные операционные системы используют многоуровневые механизмы защиты для предотвращения эксплуатации уязвимостей. Два ключевых из них — DEP (Data Execution Prevention) и ASLR (Address Space Layout Randomization) . DEP блокирует выполнение кода в областях памяти, помеченных как «некодовые» (например, стек или куча), а ASLR усложняет атаки, рандомизируя расположение сегментов памяти. В этом разделе мы разберем, как эти механизмы работают, и изучим методы их обхода с помощью Rust.

9.1. DEP: От теории к практике

Что такое DEP?
DEP (Data Execution Prevention) — технология, которая помечает определенные регионы памяти (стек, куча) как неисполняемые . Это предотвращает выполнение shellcode, внедренного через уязвимости вроде переполнения буфера.

Как DEP работает на низком уровне?

  • При включении DEP процессор и ОС используют бит NX (No-eXecute) в таблицах страниц памяти.
  • Попытка выполнить код в защищенной области вызывает исключение (например, segmentation fault).

Обход DEP через ROP-цепочки
Если DEP блокирует выполнение shellcode, атакующие используют уже существующий код в памяти — ROP-гаджеты (Return-Oriented Programming). Эти гаджеты — короткие последовательности инструкций, завершающиеся командой ret. Их комбинация позволяет выполнять произвольные действия, не нарушая DEP.

Пример на Rust: Генерация ROP-цепочки

Важно: Для работы с адресами памяти и ROP-гаджетами потребуется анализ бинарников (например, с помощью gdb и pwntools).

9.2. ASLR: Рандомизация и ее слабые места

Как работает ASLR?
ASLR случайным образом перемещает базовые адреса ключевых сегментов памяти:

  • Стек.
  • Куча.
  • Библиотеки (libc, libstdc++).

Это делает невозможным заранее знать адреса функций или буферов.

Методы обхода ASLR

  1. Утечка адресов
    Если в приложении есть уязвимость, возвращающая указатель (например, форматная строка), можно получить базовый адрес библиотеки и рассчитать смещения.
  2. Частичный контроль памяти
    Даже при включенном ASLR некоторые адреса могут быть предсказуемыми. Например, в 32-битных системах энтропия ASLR низкая.
  3. Использование памяти без ASLR
    Некоторые регионы (например, стек в старых ядрах) могут не рандомизироваться.

Пример на Rust: Чтение /proc/self/maps (Linux)

Этот код показывает расположение сегментов памяти, что полезно для анализа ASLR.

9.3. Совместный обход DEP и ASLR

Комбинированная атака

  1. Сначала обойти ASLR, получив утечку адреса (например, через уязвимость чтения за пределами буфера).
  2. Затем использовать ROP-цепочку для обхода DEP, выполнив полезную нагрузку в известной области памяти.

Пример: Обход DEP+ASLR через утечку libc

9.4. Использование unsafe и FFI для низкоуровневых манипуляций

Работа с сырыми указателями
Для обхода защит часто требуется манипулировать памятью напрямую. В Rust это делается через unsafe:

Интеграция с C-библиотеками
Через FFI можно вызывать функции из libc для работы с памятью:

9.5. Этические аспекты и защита

Ответственное использование

  • Техники из этой главы предназначены для обучения и этического хакинга.
  • Всегда получайте разрешение перед тестированием систем.

Защита своих приложений

  • Используйте Rust для минимизации уязвимостей (Ownership, Borrow Checker).
  • Включайте флаги компилятора: -fstack-protector, -D_FORTIFY_SOURCE.

Заключение
DEP и ASLR — мощные, но не идеальные механизмы. Понимание их работы и методов обхода критически важно для кибербезопасности. Rust, благодаря строгой типизации и управлению памятью, помогает писать безопасный код, но знание низкоуровневых атак позволяет защищать системы на новом уровне. В следующем разделе мы рассмотрим интеграцию Rust с другими языками для создания высокопроизводительных инструментов.

Хакинг на языке программирования Rust

На этом все. Всем хорошего дня!

Цикл статей по курсу — «Хакинг на Rust».