Я уже неоднократно писал про известные и не очень криптоалгоритмы. На этот раз хочу обратить внимание на потоковый шифр Rabbit. Этот шифр был создан в качестве более шустрой альтернативы классическим крипторам типа AES, его даже отправляли на конкурс eStream, но пока безрезультатно. Впрочем, про то, как и кем он был создан и почему считается быстрым, а также всю теорию и лирику, касающуюся этого криптоалгоритма, ты и сам на досуге можешь прочитать в Википедии. А я, как обычно, разберу практические аспекты его применения и реверса на примере конкретного приложения.
Итак, на этот раз постановка задачи следующая. Имеется некое узкоспециализированное приложение, название которого мы по понятным причинам называть не будем. Одна из его специфических функций — конвертирование данных в редкий экзотический формат, требуется его реверсировать и по возможности написать собственный конвертер по полученным данным. По счастью, приложение ничем не защищено, написано на C с легким налетом Qt, а его код открыт для исследования.
Файлы данных, которые нам предстоит исследовать, очень объемные и совершенно несжимаемые, энтропия просто зашкаливает, и, на первый взгляд, заполнены они исключительно белым шумом. Попробуем оценить динамику блочной записи в них при помощи программы Process Monitor. Ставим фильтр на файловые операции и имя нашего приложения, затем включаем процесс экспорта. В логе Procmon видно, что файл пишется последовательными блоками размером по 0x40000 байт, причем перед каждой записью блок примерно такой же длины считывается из входного файла.

То есть никакой компрессии формат не использует, исключительно шифрование. Попробуем проследить, что именно происходит с блоком данных между чтением из исходного файла и записью в исследуемый. Для этого мы снова действуем по схеме, которую я уже неоднократно описывал: открываем программу в нашем любимом отладчике x64dbg и непосредственно перед операцией сохранения ставим точку останова на функцию kernel32.. На всякий случай поставив условие для останова — фильтр по длине, равной 4096=0x1000, поскольку мы обратили внимание, что блоки такого размера частенько читаются из входного файла данных. Дальнейшую последовательность действий, я думаю, ты уже выучил наизусть по моим предыдущим статьям — как только программа останавливается для чтения очередного блока данных, мы смотрим стек вызовов и определяем место вызова текущего fread из основной программы. В IDA это место выглядит так.

Код похож именно на то, что мы искали, — цикл чтения/сохранения данных блоками 0x40000 байт. Попробуем проследить, какие манипуляции происходят с блоком данных между fread и fwrite.

Легко видеть, что считанные в буфер v21 данные из него же и сохраняются, однако побывав перед этим в процедуре sub_1402CBAA0. Внутри нее нас ожидает ужасная мешанина головоломного кода со множеством битовых операций и «волшебных» констант.

Сильно похоже на криптоалгоритм, причем не шибко популярный. Навскидку загуглив первую же встретившуюся константу из него — 749914925=0x2CB2CB2D, с огорчением видим, что Гугл с его искусственным интеллектом ничего вразумительного подсказать не может. По счастью, у нас есть более действенные инструменты. К примеру, загрузив нашу исследуемую программу в Krypto analyzer, мы убеждаемся в том, что имеем дело именно с Rabbit.

Попробуем теперь разобраться в том, каким боком этот алгоритм прикручен к решению нашей задачи и как реализовать его функционирование в собственной программе. Для этого нам все‑таки придется слегка нырнуть в теорию. Бегло прочитаем описание алгоритма, статью из Википедии и для большей наглядности — спецификацию от авторов Rabbit. Чтобы тебе было проще разобраться в этой высоконаучной писанине, попробую на пальцах объяснить суть того, что мы ищем.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

