Реверс Rust-бинаря с CTF: monomorphization превращает дизасм в кашу — ваши подходы?

Рейтинг: 60.1% · 14 голосов
Capture The Flag, реверс бинарных файлов, разработка эксплойтов, ассемблер, форензика, крэкми и задачи по информационной безопасности.
Ответить
Аватара пользователя
Omoto
Сообщения: 120
Зарегистрирован: 12 май 2026, 03:05

Реверс Rust-бинаря с CTF: monomorphization превращает дизасм в кашу — ваши подходы?

Сообщение Omoto »

Сижу над реверс-таской с CTF: статический бинарь, собран Rust в release, символы стрипнуты, но часть panic-строк осталась. Ghidra 11.3 на декомпиляции захлёбывается — итераторы заинлайнены, кругом memcpy, каждый Result/Option развёрнут в портянку ветвлений. 12 тысяч функций в листинге, из которых пользовательских от силы пара десятков, остальное — std и core. Глаза разбегаются.

Как вы подходите к Rust-релизу? Чем отделяете свой код от рантайма, чтобы не курить весь core::fmt вручную?
👍 ❤️1 🔥 😄 🤔
✔ Лучший ответ сформирован автоматически — wasmhacker
Дам workflow, который у меня стабильно работает на стрипнутых Rust-релизах. 1) strings по бинарю — вытаскиваю строку с версией rustc и хеш коммита. Это нужно, чтобы подобрать сигнатуры стандартной библиотеки. 2) Накатываю сигнатуры std (по аналогии с FLIRT). После этого Ghidra сама подписывает условные 9-10 тысяч функций как библиотечные, и в листинге остаётся именно твой код. 3) Ищу lang_start…
Перейти к ответу →
Аватара пользователя
qemukun
Сообщения: 29
Зарегистрирован: 15 май 2026, 03:32

Re: Реверс Rust-бинаря с CTF: monomorphization превращает дизасм в кашу — ваши подходы?

Сообщение qemukun »

@Omoto, Зацепка номер один — panic-строки и пути к исходникам. В release они часто остаются: видишь called Result::unwrap() on an Err value и рядом строку с именем файла и номером строки. По этим строкам делаешь xref и сразу прыгаешь в логику, а не в рантайм. Заодно из строк нередко торчит версия rustc — полезно для сигнатур. Ghidra тут вторична, я под Rust беру Binary Ninja, у него инлайны разворачиваются приятнее, ну или rizin.
👍 ❤️ 🔥 😄 🤔1
Аватара пользователя
wasmhacker
Сообщения: 8
Зарегистрирован: 21 май 2026, 11:33

Re: Реверс Rust-бинаря с CTF: monomorphization превращает дизасм в кашу — ваши подходы?

Сообщение wasmhacker »

✔ Лучший ответ — сформирован автоматически
Дам 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 своих. Дальше уже терпимо.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
lost300z
Сообщения: 77
Зарегистрирован: 11 май 2026, 04:27

Re: Реверс Rust-бинаря с CTF: monomorphization превращает дизасм в кашу — ваши подходы?

Сообщение lost300z »

@qemukun, Я ещё прогоняю декомпиль через локальную модель — прошу переименовать переменные и накидать комменты по смыслу. Иногда экономит время на рутине, но врёт уверенно: придумывает семантику, которой нет. Доверять нельзя, как подсказку для гипотез — норм. Облачным моделям таск с CTF не отдаю принципиально, мало ли что в бинаре.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
mjp1982
Сообщения: 55
Зарегистрирован: 11 май 2026, 04:28

Re: Реверс Rust-бинаря с CTF: monomorphization превращает дизасм в кашу — ваши подходы?

Сообщение mjp1982 »

По конкретной таске совет банальный: не реверси проверку флага статически, если можно не реверсить. Поставь бряк на сравнение или memcmp, подай любой ввод нужной длины и смотри, с чем сравнивают. В половине CTF-Rust-тасок там обычный constant-time compare с зашитой константой, и флаг вылезает в регистрах за минуту.
👍 ❤️ 🔥1 😄 🤔
Ответить
Поделиться темой: ✈ Telegram VK

Вернуться в «CTF и реверс-инжиниринг»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя