Данный текст всего лишь небольшой writeup трех реверсерских историй вокруг маскота конференции OffZone 2024. Тот самый символ конференции – загадочный куб (таинственный предмет с глазом). Как объясняют организаторы про кубоглазы – «идея была в том, что не только люди тянутся к новым технологиям и их безграничному потенциалу, но и технологические артефакты тянутся к людям в ответ, пытаясь понять иррациональную природу человека». Как раз к «новым технологиям» можно было прикоснуться, решив три задачки на реверс.
Сами задания не зубодробительные, без нудного брутфорса, логичные, компактные, с приятными мелочами, за что респект их автору @revker. Рассмотрим их в порядке возрастания сложности. И, да, картинок будет много. Бинари можно взять с облака.
CUB_3_3 = Зеленый куб (стартовая цена 400)
Легенда и данные задачи на рисунке

А Вы, уважаемый читатель, когда-нибудь пробовали отмерить что-либо без линейки? Так скажем сантиметров 60. Сложно, но можно. А такие люди живут среди нас. Удивительные товарищи: прикинут на глаз, раз и готово. Проверяешь с линейкой, и точно тот самый размер. И всё благодаря опыту («сын ошибок трудных»). В обратной разработке такой метод уважаемые люди называют «глазным реверсом». В этом случае не требуется сложных инструментов, достаточно любого hex-редактора (в моем случае WinHex). Поехали!
Рассмотрим файлы green_dump и commands.txt. Глянув на содержимое команд, уверенно предполагаем, что green_dump – это дамп сессии процесса python.exe. Повторим, первые пять команд создания случайного ключа на компе (Crypto – это модуль известного пакета pycryptodome, который должен быть установлен для питона заранее).

Последняя введенная команда на картинке выше – «key, iv» выводит содержимое сгенерированного ключа key и инициализирующего вектора iv в консоль в формате «(b’…’, b’…’)». Созданный сгенерированный ключ будет отличаться от ключа в дампе, поэтому ищем содержимое ключа по формату (первых символов «(b’» хватит) в green_dump.

Находим два вхождения. Содержимое key и iv и там и там одинаковое, но обратим внимание, что во втором вхождении перед выделенным блоком есть структура: некий адрес (не очень важно на что он указывает) и размер 63h, совпадающий с длиной нашего результата. Итак, ключ и вектор получили:

И этот ключ используется для шифрования некоего файла green_cube.png по алгоритму AES CBC.

Чем хорош png-файл? Тем, что первые 16 байт – это константа. Ну, почти.

Поиск в дампе этой константы не привел к успеху. Тогда зашифровываем первые 16 байт png заголовка с найденным ключом и пробуем найти зашифрованный заголовок в дампе.

Результат найден с похожей структурой: адрес (и снова не очень важно на что он указывает) + размер (150560h). Осталось только расшифровать эти данные и получить флаг.

Задача оказалась столь популярной и на второй день конференции организаторы перестали за неё выдавать offcoin (местная чеканная монета).
Мораль. Тренируйте «глазной реверс».
CUB_3_4 = Синий куб (стартовая цена 700)
Легенда и данные задачи на рисунке

В книге «Искусстве ясно мыслить» Рольфа Добелли есть пассаж про альтернативные пути на примере двух людей. Один рискнул жизнью и выиграл в русскую рулетку 10 лимонов, а другой усердно работал и заработал те же 10 лимонов только за 20 лет. И человек со стороны, глядя на этих уже богатых людей, не знает в чём принципиальная разница между ними: в уровне риска при обретении денег. «Что такое альтернативные пути? Всё, что могло бы произойти, но не произошло. Альтернативные пути невидимы для окружающих, оттого мы так редко о них задумываемся». Уязвимости – это альтернативные пути в цифровом мире. И эта задачка хороший пример этому.
Удобный 64-битный бинарь на STL C++. Почему удобный? Есть отладочные символы, нет антиотладки, обфускаций и пр.
Что же делает программа, кроме того, что при старте просит ввести имя. Позволяет ходить по семи комнатам CubeRoom(в отладочных символах имя «кубокомната» применяется, а в консоли пишется как «комната»). При запуске программы оказываемся в одной из них (точнее в одной и той же – этот момент захардкожен), поэтому перемещаться можно только в шесть других. Каждая комната имеет номер (9-тизначный, чтоб лучше запоминалось
