Курс — Хакинг на Rust. #17 Инструменты хакера на Rust. Создание эксплойтов. Инструменты для анализа бинарников (например, GDB + Rust)
Здравствуйте, дорогие друзья.
Анализ бинарного кода — ключевой этап создания эксплойтов и исследования уязвимостей. В Rust, несмотря на высокий уровень абстракции, бинарники сохраняют низкоуровневые особенности, что делает их анализ схожим с C/C++. Однако есть нюансы:
- Манглирование имён: Rust использует сложные схемы именования функций (например,
_ZN4core3ptr18real_drop_in_place17h...
). - Оптимизации LLVM: Компилятор агрессивно оптимизирует код, усложняя чтение дизассемблированного кода.
- Структуры данных: Контейнеры вроде
Vec
илиString
требуют понимания их внутреннего устройства.
Для эффективного анализа используются:
- Отладчики: GDB, LLDB.
- Дизассемблеры: Radare2, Ghidra, Binary Ninja.
- Фреймворки: Pwntools (Python), pwntools-rs (Rust).
GDB: Основной инструмент для отладки
GDB (GNU Debugger) позволяет анализировать выполнение программы, проверять регистры, память и стек. Для Rust существуют специальные расширения, упрощающие работу.
Установка и настройка
- Установите GDB и плагин для Rust:
1 2 |
sudo apt install gdb # Для Linux rustup component add rust-gdb # Добавляет rust-gdb с подсветкой синтаксиса |
2. Запустите программу в GDB:
1 |
rust-gdb ./target/debug/my_rust_app |
Полезные команды GDB
break main
: Установить точку останова на функцииmain
.run <args>
: Запустить программу с аргументами.disassemble
: Показать дизассемблированный код текущей функции.info registers
: Вывести значения регистров.x/20xw $rsp
: Просмотреть 20 слов (4 байта) по адресу стека (RSP).bt
: Показать трассировку стека.
Пример: Анализ буферного переполнения
Пусть есть уязвимая программа:
1 2 3 4 5 6 7 8 9 10 11 12 |
fn vulnerable(input: &[u8]) { let mut buffer = [0u8; 8]; unsafe { std::ptr::copy(input.as_ptr(), buffer.as_mut_ptr(), input.len()); } } fn main() { let args: Vec<String> = std::env::args().collect(); let input = args[1].as_bytes(); vulnerable(input); } |
Шаги анализа:
- Скомпилируйте программу с отладочной информацией:
1 |
cargo build --bin vulnerable_app |
2. Запустите в GDB:
1 |
rust-gdb ./target/debug/vulnerable_app |
3. Установите точку останова в функции vulnerable
и запустите с аргументом:
1 2 |
(gdb) break vulnerable (gdb) run $(python -c 'print("A"*20)') |
4. Проверьте регистры и стек после переполнения:
1 2 |
(gdb) info registers rsp rbp rip (gdb) x/20xw $rsp |
Если RIP перезаписан на 0x41414141
, уязвимость подтверждена.
Работа с манглированными именами
Rust-функции имеют длинные имена вида _ZN4core3ptr10drop_in_place17h...
. Используйте rustfilt
для деманглирования:
1 |
rustfilt _ZN4core3ptr10drop_in_place17h... # Выведет: core::ptr::drop_in_place |
В GDB можно автоматически деманглировать имена:
1 |
(gdb) set print asm-demangle on |
Дополнительные инструменты
Radare2
Мощный открытый фреймворк для анализа бинарников. Пример использования:
1 2 3 |
r2 -d ./target/debug/my_app # Запуск с отладкой > aaa # Автоанализ > pdf @ main # Вывести дизассемблер main |
Ghidra
Графический дизассемблер с поддержкой Rust. Позволяет:
- Визуализировать поток управления.
- Переименовывать функции и переменные.
- Экспортировать скрипты для автоматизации.
Pwntools-rs
Rust-версия популярного фреймворка для эксплойт-разработки. Пример:
1 2 3 4 5 6 7 8 |
use pwntools::prelude::*; fn main() { let mut tube = TcpStream::connect("127.0.0.1:9999").unwrap(); tube.sendline(b"A".repeat(200)).unwrap(); let response = tube.recvline().unwrap(); println!("Ответ: {:?}", response); } |
Советы по эффективному анализу
- Компилируйте с отладкой: Используйте
cargo build
вместо--release
для сохранения символов. - Отключайте оптимизации: В
Cargo.toml
добавьте:
1 2 |
[profile.dev] opt-level = 0 |
3. Используйте core-дампы:
1 2 |
ulimit -c unlimited # Включить дампы gdb ./app core # Анализ дампа |
- Сравнивайте версии: Уязвимости могут зависеть от версии компилятора или стандартной библиотеки.
Этический контекст
Анализ бинарников требует разрешения владельца системы. Используйте эти навыки только для:
- Обучения в CTF-соревнованиях.
- Аудита собственного кода.
- Исследований в рамках законодательства.
Задание для самостоятельной работы:
- Проанализируйте уязвимую программу из примера, найдя смещение до RIP.
- Настройте Ghidra для деманглирования Rust-функций.
- Напишите скрипт на
pwntools-rs
для автоматизации эксплойта из предыдущего раздела.
Итог:
Инструменты вроде GDB, Radare2 и Ghidra раскрывают «чёрные ящики» Rust-бинарников, помогая находить уязвимости и создавать эксплойты. Успех зависит от понимания низкоуровневых механизмов и практики.

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