Основы реверс-инжиниринга и эксплуатации бинарных файлов
Введение в обратную разработку и эксплуатацию бинарного кода
«Основы реверс-инжиниринга и эксплуатации бинарных файлов» — бесплатный урок Cyber Security Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Cyber Security Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Cyber Security Academy содержит 4 уроков всего.
Реверсинг и эксплуатация бинарных файлов вкратце
Две тесно связанные категории CTF посвящены скомпилированным программам:
- Реверс-инжиниринг (реверс) — Вы анализируете бинарный файл, чтобы понять, что он делает, часто с целью восстановить проверку пароля или скрытую логику, выводящую флаг.
- Эксплуатация бинарных файлов — Вы находите ошибку, нарушающую безопасность памяти, в работающем бинарном файле и используете её для перехвата управления выполнением, часто чтобы запустить оболочку на удалённом сервисе, где хранится флаг.
Реверсинг посвящён пониманию, а эксплуатация — взлому. И то и другое требует уверенного владения низкоуровневыми понятиями.
Первый взгляд на бинарный файл
Никогда не открывайте бинарный файл в дизассемблере без предварительной подготовки. Сначала проведите быструю проверку с помощью инструментов командной строки: определите его тип, архитектуру и найдите очевидные строки.
# Identify file type and architecture
file ./challenge
# Pull human-readable strings (flags are sometimes left in plaintext)
strings ./challenge
# Check which security mitigations are enabled
checksec --file=./challengeСтатический и динамический анализ
Вы анализируете бинарные файлы двумя взаимодополняющими способами:
- Статический анализ — читайте код, не запуская его, с помощью дизассемблера или декомпилятора, например Ghidra, либо в представлении дизассемблера. Вы видите весь поток управления, но должны самостоятельно определить значения во время выполнения.
- Динамический анализ — запускайте программу под отладчиком, например GDB, и наблюдайте реальные значения в регистрах и памяти. Вы точно видите происходящее, но только на том пути, который выполняете.
Опытные участники переключаются между этими подходами: сначала читают код статически, чтобы выстроить теорию, а затем подтверждают её динамически, пошагово выполняя программу.
Чтение дизассемблированного кода
Для реверсинга нужно читать ассемблерный код. Вам не обязательно свободно писать на нём, но необходимо распознавать распространённые шаблоны:
- cmp / test с последующим переходом (
je,jne) — это сравнение и ветвление, часто проверка пароля. - call вызывает функцию; аргументы перед этим помещаются в регистры или в стек.
- mov перемещает данные между регистрами, памятью и константами.
Если Вы нашли cmp, сравнивающий Ваш ввод, а затем переход к сообщению об успехе, значит, проверка найдена. Теперь восстановите ожидаемое значение или обойдите проверку.
Декомпиляторы ускоряют работу
Современные декомпиляторы преобразуют ассемблерный код обратно в приблизительный C-код, который читать гораздо быстрее, чем необработанные инструкции. Декомпилированная проверка пароля может выглядеть так:
// Decompiler output (approximate)
if (strcmp(user_input, "s3cr3t_p4ss") == 0) {
puts("Correct! Here is your flag:");
print_flag();
} else {
puts("Wrong.");
}Как начинается повреждение памяти
Задачи на эксплуатацию бинарных файлов используют программы, которые считывают ввод в буфер фиксированного размера, не проверяя его длину. В стеке хранятся локальные переменные и сохранённый адрес возврата, указывающий CPU, куда перейти после завершения функции.
Если ввод переполняет локальный буфер, он может перезаписать сохранённый адрес возврата. Тот, кто управляет адресом возврата, управляет дальнейшим направлением выполнения.
// Vulnerable: no bound on how much is read into buf
void vuln() {
char buf[64];
gets(buf); // reads until newline, ignores buf size
}Классическое переполнение буфера стека
Самый простой способ эксплуатации бинарного файла — перезаписать адрес возврата, чтобы перейти к функции, которую программа не должна была вызывать, например к скрытой win(), выводящей флаг.
Шаги:
- Найдите точное смещение от начала буфера до адреса возврата (инструмент для создания циклического шаблона быстро определит его).
- Найдите адрес целевой функции.
- Отправьте заполнитель до нужного смещения, а затем перезапишите адрес возврата адресом цели.
# Build the input with a Python exploit library
from pwn import *
p = process('./challenge')
offset = 72 # bytes to reach the return address
win_addr = 0x401176 # address of the win() function
p.sendline(b'A' * offset + p64(win_addr))
p.interactive()Современные механизмы защиты
Настоящие бинарные файлы используют механизмы защиты, блокирующие наивные переполнения. Вы должны распознавать их с помощью checksec:
- Стековые канарейки — секретное значение, помещённое перед адресом возврата; если оно изменилось, программа аварийно завершается. Сначала необходимо извлечь это значение.
- NX (No-eXecute) — стек не допускает выполнения, поэтому нельзя запустить помещённый в него шелл-код.
- ASLR / PIE — адреса рандомизируются при каждом запуске, поэтому перед прицеливанием необходимо получить утечку адреса.
- RELRO — защищает таблицу глобальных смещений от перезаписи.
Каждый механизм защиты подталкивает Вас к более продвинутым техникам.
Программирование, ориентированное на возврат (ROP)
Когда NX не позволяет запускать собственный код, программирование, ориентированное на возврат, повторно использует код, уже находящийся в бинарном файле.
Вы соединяете короткие последовательности инструкций, называемые гаджетами, каждая из которых заканчивается на ret, чтобы поэтапно выполнять действия — например, загружать значение в регистр и вызывать библиотечную функцию для запуска оболочки. Цепочка строится в стеке, поэтому каждый ret переходит к следующему гаджету.
ROP — это переход от простых переполнений к эксплуатации в реальных условиях, где код атакующего редко можно выполнить напрямую.
Уязвимости форматных строк
Ещё один классический примитив эксплуатации бинарных файлов — уязвимость форматной строки, возникающая, когда пользовательский ввод напрямую передаётся в качестве аргумента формата функции печати.
// Vulnerable: user controls the format string
printf(user_input); // dangerous
// Safe: user input is data, not format
printf("%s", user_input); // correctЗачем изучать это специалистам по защите
Вы учитесь точно эксплуатировать ошибки работы с памятью именно для того, чтобы предотвращать их. Основные защитные выводы конкретны:
- Никогда не используйте функции ввода без ограничения длины, такие как
getsилиstrcpy; применяйте эквивалентные функции с проверкой длины. - Не отключайте механизмы защиты: по умолчанию должны быть включены канарейки, NX, полный ASLR/PIE и полный RELRO.
- По возможности выбирайте языки с безопасной работой с памятью.
- Рассматривайте любое пользовательское значение, попадающее в форматную строку или копирование в буфер, как серьёзную проблему при проверке кода.
Быстрая проверка
Проверьте, насколько хорошо Вы поняли основы реверсинга и эксплуатации бинарных файлов.
Повторение
Теперь у Вас есть общая схема реверсинга и эксплуатации бинарных файлов:
- Проводите первичную проверку каждого бинарного файла с помощью
file,stringsиchecksecдо начала глубокого анализа. - Сочетайте статический (дизассемблер или декомпилятор) и динамический (отладчик) анализ, чтобы понять логику программы.
- Эксплуатация начинается с переполнения буфера стека, перезаписывающего адрес возврата; механизмы защиты (канарейки, NX, ASLR/PIE, RELRO) повышают сложность атаки.
- ROP обходит NX, повторно используя существующие гаджеты; уязвимости форматных строк возникают из-за недоверенных аргументов формата.
- Каждая техника одновременно служит защитным уроком по написанию и проверке более безопасного кода.
Далее Вы соберёте набор инструментов и научитесь оформлять отчёты о решениях.
Часто задаваемые вопросы
Урок «Основы реверс-инжиниринга и эксплуатации бинарных файлов» бесплатный?
Да — полный текст урока «Основы реверс-инжиниринга и эксплуатации бинарных файлов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Cyber Security Academy, подпишись на CoddyKit PRO. Курс Cyber Security Academy содержит 4 уроков всего.
Чему я научусь в уроке «Основы реверс-инжиниринга и эксплуатации бинарных файлов»?
Введение в обратную разработку и эксплуатацию бинарного кода Ты практикуешь Cyber Security Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Cyber Security Academy?
Предыдущий опыт не требуется. Cyber Security Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Основы реверс-инжиниринга и эксплуатации бинарных файлов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Cyber Security Academy?
Да. Каждый урок Cyber Security Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Категории CTF и образ мышления
- Веб-задачи и криптографические задачи
- Основы реверс-инжиниринга и эксплуатации бинарных файлов
- Инструменты и отчёты о решениях