0Pricing
Cyber Security Academy · Урок

Основы реверс-инжиниринга и эксплуатации бинарных файлов

Введение в обратную разработку и эксплуатацию бинарного кода

«Основы реверс-инжиниринга и эксплуатации бинарных файлов» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Категории CTF и образ мышления
  2. Веб-задачи и криптографические задачи
  3. Основы реверс-инжиниринга и эксплуатации бинарных файлов
  4. Инструменты и отчёты о решениях
← Назад к Cyber Security Academy