Первый 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 (отладчик для динамического анализа).
Ghidra и IDA Free: выбираем инструменты анализа бинарников
Вопрос «Ghidra или IDA?» задаёт каждый, кто начинает обратную разработку программ. Ответ - оба, но под разные сценарии. Вот сравнение по критериям, которые реально влияют на рабочий процесс при решении CTF reverse-заданий:| Критерий | Ghidra | IDA 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/UPX1 | Software 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 - извлеките или обойдите. Два пути: вычислить правильный ввод из логики (чистое решение) или пропатчить условный переход
jne → je (грязное, но быстрое). На 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'ов.
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 или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
JNZ (jump if not zero) на JZ (jump if zero) - и бинарник примет любой ввод. По данным разбора на freecodecamp.org, именно так решается ELF CrackPass с root-me: патч JNS → JMP обходит проверку ptrace, инверсия JNZ → JZ в блоке сравнения заставляет программу выводить пароль при любом вводе.Когда бинарник сопротивляется: распаковка и антиотладка
Не все 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-категории:- IOLI CrackMe (10 задач) - линейное усложнение от открытого пароля до многоэтапных проверок. Разбираются в десятках ghidra tutorial-ов на английском.
- crackmes.one - платформа с тысячами задач, фильтрация по архитектуре и сложности.
- CTF-площадки - picoCTF (начальный уровень), HackTheBox (средний и выше), Codeby Games (русскоязычная платформа с категорией RE).
- Реальные сэмплы - после 30-50 решённых crackme переходите к анализу вредоносных программ через MalwareBazaar и Hybrid Analysis.
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 с задачами от простых до средних - можете начать прямо сейчас и проверить на себе.