Сижу над реверс-таской с CTF: статический бинарь, собран Rust в release, символы стрипнуты, но часть panic-строк осталась. Ghidra 11.3 на декомпиляции захлёбывается — итераторы заинлайнены, кругом memcpy, каждый Result/Option развёрнут в портянку ветвлений. 12 тысяч функций в листинге, из которых пользовательских от силы пара десятков, остальное — std и core. Глаза разбегаются.
Как вы подходите к Rust-релизу? Чем отделяете свой код от рантайма, чтобы не курить весь core::fmt вручную?
Реверс Rust-бинаря с CTF: monomorphization превращает дизасм в кашу — ваши подходы?
Рейтинг: 60.1% · 14 голосов
Войдите, чтобы голосовать
Голосовать «За» и «Против» могут только авторизованные пользователи. Войдите в свой аккаунт — или зарегистрируйтесь, это займёт минуту.
Нет аккаунта? Зарегистрироваться
✔ Лучший ответ сформирован автоматически — wasmhacker
Дам workflow, который у меня стабильно работает на стрипнутых Rust-релизах. 1) strings по бинарю — вытаскиваю строку с версией rustc и хеш коммита. Это нужно, чтобы подобрать сигнатуры стандартной библиотеки. 2) Накатываю сигнатуры std (по аналогии с FLIRT). После этого Ghidra сама подписывает условные 9-10 тысяч функций как библиотечные, и в листинге остаётся именно твой код. 3) Ищу lang_start…
Re: Реверс Rust-бинаря с CTF: monomorphization превращает дизасм в кашу — ваши подходы?
@Omoto, Зацепка номер один — panic-строки и пути к исходникам. В release они часто остаются: видишь called Result::unwrap() on an Err value и рядом строку с именем файла и номером строки. По этим строкам делаешь xref и сразу прыгаешь в логику, а не в рантайм. Заодно из строк нередко торчит версия rustc — полезно для сигнатур. Ghidra тут вторична, я под Rust беру Binary Ninja, у него инлайны разворачиваются приятнее, ну или rizin.
- wasmhacker
- Сообщения: 8
- Зарегистрирован: 21 май 2026, 11:33
Re: Реверс Rust-бинаря с CTF: monomorphization превращает дизасм в кашу — ваши подходы?
✔ Лучший ответ — сформирован автоматически
Дам workflow, который у меня стабильно работает на стрипнутых Rust-релизах.
1) strings по бинарю — вытаскиваю строку с версией rustc и хеш коммита. Это нужно, чтобы подобрать сигнатуры стандартной библиотеки.
2) Накатываю сигнатуры std (по аналогии с FLIRT). После этого Ghidra сама подписывает условные 9-10 тысяч функций как библиотечные, и в листинге остаётся именно твой код.
3) Ищу lang_start или точку, где рантайм вызывает main — это вход в пользовательскую логику.
4) panic- и expect-строки как маяки. Каждый unwrap оставляет строку с файлом и номером строки исходника — по ним восстанавливаешь даже структуру модулей.
5) Если статика всё равно вязкая (а на тяжёлых дженериках она вязкая), не упираюсь — гоняю под gdb или вешаю Frida, дампаю состояние в рантайме. Часто проверка флага сводится к одному сравнению, которое проще поймать динамически, чем выводить статически.
На практике из тех самых 12k функций после шага 2 у тебя останется 30-50 своих. Дальше уже терпимо.
1) strings по бинарю — вытаскиваю строку с версией rustc и хеш коммита. Это нужно, чтобы подобрать сигнатуры стандартной библиотеки.
2) Накатываю сигнатуры std (по аналогии с FLIRT). После этого Ghidra сама подписывает условные 9-10 тысяч функций как библиотечные, и в листинге остаётся именно твой код.
3) Ищу lang_start или точку, где рантайм вызывает main — это вход в пользовательскую логику.
4) panic- и expect-строки как маяки. Каждый unwrap оставляет строку с файлом и номером строки исходника — по ним восстанавливаешь даже структуру модулей.
5) Если статика всё равно вязкая (а на тяжёлых дженериках она вязкая), не упираюсь — гоняю под gdb или вешаю Frida, дампаю состояние в рантайме. Часто проверка флага сводится к одному сравнению, которое проще поймать динамически, чем выводить статически.
На практике из тех самых 12k функций после шага 2 у тебя останется 30-50 своих. Дальше уже терпимо.
Re: Реверс Rust-бинаря с CTF: monomorphization превращает дизасм в кашу — ваши подходы?
@qemukun, Я ещё прогоняю декомпиль через локальную модель — прошу переименовать переменные и накидать комменты по смыслу. Иногда экономит время на рутине, но врёт уверенно: придумывает семантику, которой нет. Доверять нельзя, как подсказку для гипотез — норм. Облачным моделям таск с CTF не отдаю принципиально, мало ли что в бинаре.
Re: Реверс Rust-бинаря с CTF: monomorphization превращает дизасм в кашу — ваши подходы?
По конкретной таске совет банальный: не реверси проверку флага статически, если можно не реверсить. Поставь бряк на сравнение или memcmp, подай любой ввод нужной длины и смотри, с чем сравнивают. В половине CTF-Rust-тасок там обычный constant-time compare с зашитой константой, и флаг вылезает в регистрах за минуту.
Поделиться темой:
✈ Telegram
VK
- Похожие темы
-
- Учу ассемблер x86-64 для реверса — нужен ли вообще, если есть декомпилятор?
12 ответов · 2218 просмотров
-
-
-
- стоит ли изучать ассемблер x86 в 2025 году для реверса или достаточно декомпилятора
10 ответов · 122 просмотров
-
-
- Как реверсить античит Vanguard/BattlEye в 2026 — с чего начать и что вообще реально
9 ответов · 98 просмотров
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость