Разобранная механическая шкатулка-головоломка на антистатическом коврике: шестерёнки, штифты и защёлка разложены в взрывной проекции. Крышка с гравировкой кода освещена настольной лампой.


Первый crackme, который я загрузил в Ghidra, отнял четыре часа - три из них ушли на блуждание по интерфейсу, один на собственно анализ. Второй crackme занял двадцать минут. Задача была примерно той же сложности. Разница - в методологии: куда смотреть, какие окна открывать, какие вопросы задавать бинарнику. Ни один русскоязычный материал по реверс-инжинирингу для начинающих не дал мне эту методологию - собирал по крупицам из англоязычных курсов и сотен решённых задач. Здесь выкладываю весь путь: от настройки окружения до разбора типового crackme в Ghidra и IDA Free, чтобы ваш первый бинарник не стоил нескольких вечеров.

Требования к окружению​

Прежде чем открывать дизассемблер для начинающих, подготовьте рабочее место. Подробнее - в нашем статье о бинарный анализ уязвимостей.
  • ОС: Windows 10/11 или Linux (Ubuntu 20.04+). Ghidra работает кроссплатформенно, IDA Free - тоже, хотя на Windows комфортнее при анализе PE-файлов.
  • RAM: минимум 4 ГБ, рекомендуется 8 ГБ. Ghidra на JVM жрёт память при авто-анализе крупных бинарников - с 4 ГБ будет тесно.
  • JDK 17+ для Ghidra 11.x - качается с adoptium.net или через пакетный менеджер ОС.
  • Ghidra 11.x - актуальная версия с ghidra-sre.org. Установки нет: распаковка архива, запуск через ghidraRun (Linux) или ghidraRun.bat (Windows).
  • IDA Free 9.x - с hex-rays.com. Поддерживает x86/x64, ARM, MIPS, PPC и другие архитектуры (актуальный список - на hex-rays.com). Декомпилятор Hex-Rays в бесплатную версию не входит - только дизассемблер и Graph View.
  • Виртуальная машина - обязательна для анализа незнакомых бинарников. VirtualBox или VMware Workstation Player, оба бесплатны. Сеть внутри ВМ отключайте.
  • Опционально: CFF Explorer (Windows, быстрый просмотр PE-заголовков), x64dbg (отладчик для динамического анализа).
Все crackme-задачи - даже с доверенных CTF-платформ - запускайте строго в изолированной среде. Без исключений.

Ghidra и IDA Free: выбираем инструменты анализа бинарников​

Вопрос «Ghidra или IDA?» задаёт каждый, кто начинает обратную разработку программ. Ответ - оба, но под разные сценарии. Вот сравнение по критериям, которые реально влияют на рабочий процесс при решении CTF reverse-заданий:

КритерийGhidraIDA Free
СтоимостьБесплатно, open source (NSA)Бесплатно (ограниченная версия)
ДекомпиляторВстроенный, работает локальноОтсутствует в Free-версии
Архитектуры30+ (x86, ARM, MIPS, PPC, SPARC и др.)Множество архитектур (x86/x64, ARM, MIPS, PPC и др.)
Скриптовый движокJava, Python (Ghidra Bridge)IDC, IDAPython (ограниченно в Free)
Скорость первичного анализаМедленнее при авто-анализеБыстрее на типовых PE/ELF
Совместная работаGhidra Server для командного REНет в бесплатной версии
Offline-режимПолностью автономныйПолностью автономный (декомпилятор отсутствует)
Когда выбиратьЭкзотические архитектуры, длительный анализ, командный REБыстрый блиц на x86/x64 PE
Когда не подходитНужен мгновенный результат без настройки JDKНет декомпилятора в бесплатной версии

На CTF я держу оба: Ghidra - основной рабочий инструмент, IDA Free - для экспресс-проверки гипотез на x86-бинарниках. Ограничивать себя одним дизассемблером на старте - ошибка: каждый инструмент подсвечивает то, что второй пропускает.

Отдельно стоит упомянуть radare2 (версия 6.1.5, проект активно развивается) - консольный фреймворк для тех, кто предпочитает терминал графическому интерфейсу. Кривая обучения у него крутая - для первого знакомства с реверсом не лучший выбор. Но потом, когда захочется автоматизировать рутину через скрипты, radare2 станет незаменимым.

Методология: как подходить к незнакомому бинарнику​

Реверс-инжиниринг для начинающих часто выглядит как хаотичное тыканье по дизассемблеру. Системный подход экономит часы. Вот decision tree, которым я пользуюсь на каждой CTF reverse-задаче:

Шаг 1 - внешняя разведка (до дизассемблера). Запустите file на бинарнике: архитектура, формат (ELF/PE), тип линковки. Прогоните strings - иногда флаг или подсказка лежит в открытом тексте. Откройте файл в hex-редакторе: сигнатуры пакеров (UPX!, ASPack) видны в первых байтах.

Шаг 2 - определите препятствия. Прежде чем нырять в анализ, проверьте - не сопротивляется ли бинарник:

ПризнакТехника (MITRE ATT&CK)Действие
Секции UPX0/UPX1Software Packing (T1027.002, Defense Evasion)Распаковать через upx -d
Пустая таблица функций, нет символовStripped Payloads (T1027.008, Defense Evasion)Работать от строк и импортов
Вызов ptrace(PTRACE_TRACEME, ...)Debugger Evasion (T1622, Defense Evasion / Discovery)Патч условного перехода
XOR-циклы с константамиDeobfuscate/Decode (T1140, Defense Evasion)Извлечь ключ, написать декодер
Мусорные NOP-цепочки, мёртвые веткиJunk Code Insertion (T1027.016, Defense Evasion)Использовать декомпилятор, он фильтрует junk

Шаг 3 - найдите точку входа в логику. Не начинайте с main - начинайте со строк. В каждом crackme есть строки «Wrong password», «Try Again», «Correct!». Найдите их через Defined Strings в Ghidra (или через Shift+F12 в IDA), перейдите по перекрёстной ссылке (xref) к функции-обработчику. Это ваша целевая функция.

Шаг 4 - восстановите логику проверки. Внутри целевой функции ищите: ввод данных (scanf, fgets, GetDlgItemTextA), операции трансформации ввода (XOR, сдвиги, хеширование), сравнение результата с эталоном (strcmp, memcmp или прямой cmp).

Шаг 5 - извлеките или обойдите. Два пути: вычислить правильный ввод из логики (чистое решение) или пропатчить условный переход jneje (грязное, но быстрое). На CTF оба подхода засчитываются. Грязный путь - не позорный. Позорный - когда четыре часа ковыряешь алгоритм, а можно было инвертировать один байт.

Ghidra на практике: от проекта до декомпилятора​

Запустите Ghidra, создайте проект через File → New Project → Non-Shared Project. Импортируйте бинарник перетаскиванием в окно проекта. Ghidra автоматически определит формат и архитектуру - для типовых ELF и PE этого хватит за глаза. Двойной клик по файлу откроет Code Browser, всплывающее окно предложит авто-анализ - соглашайтесь с настройками по умолчанию.

Навигация в Code Browser​

Согласно курсу Introduction to Reverse Engineering with Ghidra на Hackaday.io, нажатие F1 при наведении на любой элемент интерфейса вызывает контекстную справку - пользуйтесь, пока осваиваетесь.

Ключевые окна для статического анализа исполняемых файлов:

Symbol Tree (левая панель) - импорты, экспорты, обнаруженные функции. Разверните Imports, чтобы увидеть используемые DLL и API-вызовы: это моментальный снимок возможностей бинарника. Если видите WriteProcessMemory или VirtualAlloc - бинарник может модифицировать код в рантайме. Тут стоит насторожиться.

Listing (центральная панель) - дизассемблированный код. Правый клик → Patch Instruction позволяет менять инструкции прямо в листинге. Навигация: двойной клик на адресе CALL переносит внутрь функции, Alt+← возвращает назад.

Decompiler (правая панель) - псевдокод на C. Подсветка строки в декомпиляторе подсвечивает соответствующий ассемблер в листинге - и наоборот. Для тех, кто учится читать ассемблер, это бесценно: видите if (iVar1 == 0) справа, смотрите CMP и JNZ слева, и связь между высокоуровневым и низкоуровневым кодом становится осязаемой. После десятка таких сопоставлений ассемблер перестаёт выглядеть китайской грамотой.

Function Graph (Window → Function Graph) - граф потока управления, аналог Graph View в IDA. По умолчанию открывается в уменьшенном масштабе - правый клик → Properties → Start Fully Zoomed In исправляет это (почему это не по умолчанию - загадка).

Декомпилятор - главный инструмент новичка в RE​

Декомпилятор бинарного кода в Ghidra не идеален: переменные именуются iVar1, uVar2, типы данных иногда определяются криво. Но для начинающих он критичен - вместо чтения десятков ассемблерных инструкций вы видите C-подобный код.

Приёмы, ускоряющие работу:
  • Правый клик на переменной → Rename Variable - дайте переменным осмысленные имена. Ghidra синхронизирует их между декомпилятором и листингом автоматически.
  • Правый клик на функции → Edit Function Signature - исправьте типы параметров, если Ghidra ошиблась. Декомпилированный код мгновенно станет читабельнее.
  • Код из окна декомпилятора копируется напрямую - удобно для CTF-отчётов и writeup'ов.
Первое действие после авто-анализа - Window → Defined Strings. Это окно показывает все строковые литералы бинарника. Для crackme-решения достаточно найти строки с «password», «correct», «wrong» и перейти по xref к функции-обработчику. В 80% случаев задача решается именно от строк.

IDA Free: ключевые приёмы для CTF reverse-заданий​

По моему опыту, IDA Free чуть шустрее при первичном анализе небольших CTF-бинарников (<5 МБ) - загрузка типового PE-файла с авто-анализом занимает секунды, Ghidra на том же файле может потребовать больше времени из-за JVM-старта. На блиц-раундах CTF это ощутимо.

Основные отличия рабочего процесса от Ghidra:

Graph View активен по умолчанию (пробел переключает режимы). Блоки кода соединены цветными стрелками: зелёная - условие выполнено, красная - не выполнено. Визуальная навигация по ветвлению интуитивнее плоского листинга и ускоряет понимание логики проверки пароля.

Декомпилятор в IDA Free отсутствует - F5 (Hex-Rays) доступен только в платной IDA Pro. Это главный аргумент в пользу Ghidra для новичков: её встроенный бесплатный декомпилятор работает локально и не требует лицензии. Без декомпилятора вам придётся читать чистый ассемблер - навык полезный, но на старте болезненный.

Перекрёстные ссылки: выделите строку или имя функции, нажмите X - появится список всех мест использования. Быстрое переименование через N на любом адресе. Скорость навигации в IDA исторически отточена лучше - тут надо отдать должное.

Как читать ассемблер в IDA: начинайте с графа функции, найдите блок с вызовом strcmp или инструкцией cmp, поднимайтесь вверх по графу - там логика формирования проверочного значения. IDA подкрашивает регистры, что облегчает визуальное отслеживание потока данных.

Решаем crackme: пошаговый разбор​

Разберём типичную методику на паттернах, которые встречаются в IOLI CrackMe - наборе из 10 задач возрастающей сложности, широко используемом для обучения реверсу (упоминается в серии Here Be Dragons: Reverse Engineering with Ghidra на malware.news).
📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
Патчинг - способ обойти проверку без вычисления пароля. В Ghidra: правый клик на инструкции → Patch Instruction. Заменяете JNZ (jump if not zero) на JZ (jump if zero) - и бинарник примет любой ввод. По данным разбора на freecodecamp.org, именно так решается ELF CrackPass с root-me: патч JNSJMP обходит проверку ptrace, инверсия JNZJZ в блоке сравнения заставляет программу выводить пароль при любом вводе.

Когда бинарник сопротивляется: распаковка и антиотладка​

Не все crackme сдаются после авто-анализа. Авторы задач используют техники из арсенала реального вредоносного ПО - и понимание этих техник одинаково полезно для CTF и для исследования малвари в перспективе.

Пакеры (Software Packing, T1027.002, Defense Evasion). Загрузили в Ghidra - видите минимум функций и секции с именами UPX0 / UPX1? Бинарник упакован. Согласно разбору FatMike's CrackMe на fewstreet.com, Ghidra в таком случае находит только _entry, а Defined Strings пуст. Проверьте через CFF Explorer: поле File Info покажет «UPX 2.90» или аналогичное. Распакуйте командой upx -d packed.exe и повторно импортируйте в Ghidra - появятся функции, строки и осмысленный декомпилированный код. UPX встречается в CTF-задачах начального и среднего уровня; в реальном вредоносном ПО пакеры сложнее (Themida, VMProtect), но принцип распознавания тот же - энтропийный анализ и сигнатуры секций.

Антиотладка (Debugger Evasion, T1622, Defense Evasion / Discovery). Вызов ptrace(PTRACE_TRACEME, 0, 1, 0) в Linux-бинарнике - классика: если процесс уже трассируется отладчиком, ptrace возвращает ошибку, и программа завершается. В декомпиляторе выглядит как проверка возвращаемого значения ptrace с последующим abort(). Обход: патч условного перехода после ptrace-вызова - замена JNS на безусловный JMP. Альтернатива без патча - подмена ptrace через LD_PRELOAD с библиотекой-заглушкой. Второй способ элегантнее, но первый быстрее.

Отсутствие символов (Stripped Payloads, T1027.008, Defense Evasion). Бинарник, собранный с флагом -s, не содержит отладочной информации. Все функции отображаются как FUN_004xxxxx, переменные - local_XX. Это не тупик: строки и таблица импортов остаются. Работайте от строк к xrefs, переименовывайте функции по мере понимания. После переименования 5-7 ключевых функций картина складывается - как пазл, где сначала собираешь углы.

Мусорный код (Junk Code Insertion, T1027.016, Defense Evasion). Серии NOP, бессмысленные MOV EAX, EAX, мёртвые ветки - всё это затрудняет чтение листинга, но декомпилятор Ghidra отфильтровывает мусор в большинстве случаев. Ещё один аргумент работать через декомпилятор, а не через чистый ассемблерный листинг.

Куда двигаться после первого crackme​

Решённый первый crackme - точка входа, а не финиш. Прогрессия для CTF reverse-категории:
  1. IOLI CrackMe (10 задач) - линейное усложнение от открытого пароля до многоэтапных проверок. Разбираются в десятках ghidra tutorial-ов на английском.
  2. crackmes.one - платформа с тысячами задач, фильтрация по архитектуре и сложности.
  3. CTF-площадки - picoCTF (начальный уровень), HackTheBox (средний и выше), Codeby Games (русскоязычная платформа с категорией RE).
  4. Реальные сэмплы - после 30-50 решённых crackme переходите к анализу вредоносных программ через MalwareBazaar и Hybrid Analysis.
Параллельно подтягивайте: формат PE-файлов (анализ PE-файлов - секции, импорты, экспорты), базовые инструкции x86 (mov, cmp, jmp, call, push, pop, xor), конвенции вызова (cdecl, stdcall). Книга «Practical Malware Analysis» - стандартный учебник, рекомендуемый во всех подборках по реверсу, включая русскоязычные. Первая спецификация PE вышла ещё с Win3.1, и за 30+ лет формат принципиально не изменился - так что материалы не устаревают.

Пройдя несколько сотен crackme, прихожу к неудобному выводу: порог входа в реверс-инжиниринг - искусственный. Не ассемблер сложен и не инструменты страшны - устарела методология обучения, которая не менялась десятилетиями. Русскоязычные материалы по обратной разработке программ почти всегда открываются теорией: PE-формат, стек, таблица регистров x86, режимы адресации. Через три страницы новичок засыпает, не добравшись до бинарника.

Мой подход противоположный: открыл Ghidra, загрузил crackme, нашёл строку «Wrong», перешёл по xref, прочитал декомпилятор - и только потом, когда стало интересно, полез разбираться, что такое cmp и почему jne прыгает именно туда. Контекст порождает мотивацию к теории, а не наоборот. По моим наблюдениям, новички на CTF-площадках продвигаются быстрее, начиная с практики, а не с Intel Software Developer Manual. Ассемблерный листинг перестаёт пугать после третьего решённого crackme - не после третьей прочитанной главы учебника.

Кто считает иначе - предлагаю эксперимент: дайте одному новичку crackme с Ghidra без вводных, а другому - учебник по ассемблеру. Через неделю сравните, кто дальше продвинулся и кому интереснее продолжать. На Codeby Games есть категория RE с задачами от простых до средних - можете начать прямо сейчас и проверить на себе.
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

Похожие темы

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab