Ques/Help/Req Решения CTF 2023 от «Доктор Веб». Часть 4

XakeR

Member
Регистрация
13.05.2006
Сообщения
1 912
Реакции
0
Баллы
16
Местоположение
Ukraine
Друзья, продолжаем публиковать решения нашего CTF-марафона! В нем было пять уровней сложности, в каждом по пять заданий — всего 25 заданий. Каждую неделю мы выкладываем по 5 решений — сегодня рассказываем о четвертом уровне сложности. Предыдущие уровни вы можете изучить здесь: часть 1, часть 2, часть 3.

Результаты марафона мы подвели в начале апреля, но задания все еще доступны — и вы можете попробовать решить их для себя.

Решения CTF 2023 от «Доктор Веб». Часть 40


CTF-2023 от «Доктор Веб»: задания уровня Legendary​

1. DrYara​


Судя по отзывам участников, это задание скорее пятого уровня I Feel No Pain и должно оцениваться в 500 баллов, но у нас получилось, что оно лишь четвертого уровня и оценивается в 400 баллов.

В задании дается скомпилированное yara-правило. Обычно yara-правила нужно только компилировать, а декомпилировать их не приходится, поэтому для этого подходящего инструментария, как правило, нет. Конечно, есть проекты на GitHub, но, как оказывается, что версия яры, для которой был скомпилирован этот файл совершенно не подходит для этой софтины.

Следовательно, давайте будем изобретать велосипед и исследовать файл яры. Какие источники могут в этом помочь: REVERSING 2020 — Rules as code, A look at the YARA compiler’s output


Так-же у нас есть исходники, они всегда при нас:


Далее стоит попробовать компилировать правила с разными условиями и смотреть, какой бинарник дается в результате. Уже после можно будет делать предположения по структуре, оффсетам и вообще компиляции.

Хидер:

Решения CTF 2023 от «Доктор Веб». Часть 41


Стоит заранее определить версию yara — в данном случае должна подойти 4.2.x. Как это понять? Сейчас стоит версия яры 0x13 (19):

Решения CTF 2023 от «Доктор Веб». Часть 42


Идем в гитхаб яры, шагаем по веткам и ищем ветку, в которой будет аналогичная версия арены (yara/libyara/include/yara/arena.h):

Решения CTF 2023 от «Доктор Веб». Часть 43


Другие версии запускать не стоит — yara очень часто меняет операционные коды и не продумывает обратную совместимость, поэтому если пытаться запустить файл на неправильной версии, в работе рано или поздно возникнет фатальная ошибка из-за неправильно опкода — даже если первоначально файл пропатчить и заставить-таки yara запуститься.

Шаг 1.

Базовую структуру файла, которую необходимо составить, можно увидеть в бинарном файле:

Решения CTF 2023 от «Доктор Веб». Часть 44


Если мы знакомы с ярой, то сразу видим символы переменных, начинающихся с $, а также некие значения, с разделителем 00. Так как первая переменная называется magic, а ее значение равно PK, то можно определить, что мы будем иметь дело с zip архивом:

Решения CTF 2023 от «Доктор Веб». Часть 45


Тот же трюк провернем для всех переменных:

Решения CTF 2023 от «Доктор Веб». Часть 46


В результате получается:

Решения CTF 2023 от «Доктор Веб». Часть 47


Затем нужно сопоставить названия со структурой zip-архива, а точнее его хидера:

Решения CTF 2023 от «Доктор Веб». Часть 48


В результате почти все известные переменные указаны — осталось еще добавить строки, но мы пока не знаем как

Решения CTF 2023 от «Доктор Веб». Часть 49


Шаг 2.

Переходим на следующее правило, MeDoesWat, определяем его метадату просто читая данные после разделителя. Само правило содержит только некую переменную $wat , но значение не задано явно — для того, чтобы узнать его, необходимо смотреть байткод.

Ищем точку входа, тут можно отдебажить, сопоставить по структурам в статике или вообще собрать свою яру с принтами и дебагом через визуалку:

Решения CTF 2023 от «Доктор Веб». Часть 410


Начинаем парсить байткод, лично я просто собрал свою яру и нашел точку входа для байткода яры:

Решения CTF 2023 от «Доктор Веб». Часть 411
Решения CTF 2023 от «Доктор Веб». Часть 412


Далее этот байткод нужно прочитать. Если читать его визуалкой, то получится подстроиться под каждое новое условие, которое нужно будет выполнить для удачного запуска yara.

Каждая отработка опкода содержит под собой вызов дебажного принта, который, при желании, можно заставить работать:

Решения CTF 2023 от «Доктор Веб». Часть 413


Есть вариант сделать дебажный принт путем find & replace:

Решения CTF 2023 от «Доктор Веб». Часть 414


В результате получается:

Решения CTF 2023 от «Доктор Веб». Часть 415


Спарсить опкоды тоже можно через find & replace, а не через скрипт:

Решения CTF 2023 от «Доктор Веб». Часть 416


Результат получается не идеальный, но читаемый. Если знать точку входа, то можно будет считать оффсеты и корректно пропарсить аргументы к опкодам, например:

Решения CTF 2023 от «Доктор Веб». Часть 417


Так же можно остановиться опкоде и посмотреть, что он делает — например, обратить внимание на опкод filesize:

Решения CTF 2023 от «Доктор Веб». Часть 418


Если его отдебажить, окажется, что он читает размер файла — что, учитывая его название, вполне логично:

Решения CTF 2023 от «Доктор Веб». Часть 419


Судя по опкодам, которые идут после, затем пушится размер и происходит что-то еще — скорее всего, так или иначе поверяется размер файла, по которому будет отработано правило. Опкод OP_INT_GT (скорее всего, это int_greater) сравнивает два регистра: в r1 лежит размер файла, в r2 — 0x100000, число для сравнения.

Решения CTF 2023 от «Доктор Веб». Часть 420


Следовательно, файл должен стать размером больше 1 МБ. Бьем нули:

Решения CTF 2023 от «Доктор Веб». Часть 421


Таким же методом находим референс на следующую конструкцию (есть еще интересные опкоды типа OP_BITWISE_XOR, но про них в третьем шаге):


Решения CTF 2023 от «Доктор Веб». Часть 422
Решения CTF 2023 от «Доктор Веб». Часть 423


Получаем нечто подобное:

01 ?? ?? ?? ?? ?? ?? 02 ?? ?? ?? ?? ?? AB CD EF ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 00 00 ?? ?? ?? ?? ?? ?? 00 ?? ?? ?? ?? ?? 6C ?? ?? 20 44 41 ?? ?? ?? ?? ?? ??

**Почему это wat?

Теперь, сверяем имеющиеся у нас константы и пытаемся выставить их так, чтобы все это попадало под эту регулярку. Почему именно так? Мы можем поискать подобные байты в уже имеющихся выражениях и заметим следующую картину:

Решения CTF 2023 от «Доктор Веб». Часть 424


Выравниваем строки, чтобы все подходило под регулярку, как оказалось требовалось добавить байт-разделитель между строками, сами строки даже стояли верно.

Решения CTF 2023 от «Доктор Веб». Часть 425


Правило MeDoesWat теперь отрабатывает:

Решения CTF 2023 от «Доктор Веб». Часть 426


Еще можно вспомнить, что первое правило у нас так и не отработало, чтобы не делать кучу лишних скринов скажу так, я прошелся по разным опкодам, заинтересовали меня OP_FOUND_AT и OP_FOUND_IN. Опкод OP_FOUND_AT отрабатывает без всяких нареканий, так-что будем смотреть в OP_FOUND_IN:

Решения CTF 2023 от «Доктор Веб». Часть 427


Опкод подгружает в себя регистры r1, r2, r3, со значениями 0xFFFABADAFBAFAFF, 0x200 и неким указателем. Указатель привел меня на строки VOLGA, DA_CRACK и переменную $extra, но они по какой-то причине не отрабатывали. И тут находим такой вот дефайн:

Решения CTF 2023 от «Доктор Веб». Часть 428


Судя по всему правило скомпилировалось с ошибкой и теперь просто не хочет работать, так как опкод OP_FOUND_IN прекращает работу из-за значения 0xFFFABADAFBAFAFF. Мы уже нашли нужные локации для наших строк, так что понятно, что диапазон должен быть выставлен такой: 0 … 0x200.

Можно это легко пофиксить, поменяв значение переменной во время дебага, если очень принципиально, чтобы отработанное правило все-таки вылезло:

Решения CTF 2023 от «Доктор Веб». Часть 429


Теперь осталось напечатать флаг, который печатается правилом MeDoesFlag, с относительно недавно добавленной функций console.log() в яру. Именно тут и вылезает тот самый опкод OP_BITWISE_XOR. console.log() можно определить по этой странной вставочке:

Решения CTF 2023 от «Доктор Веб». Часть 430


Именно она, в том числе, передается в OP_CALL при исполнении этого опкода.


Код подгружает значение нашего ключа $key и ксорит его с определенными локациями, которые он подгрузил через OP_PUSH_8. Так как яра не умеет в сложные математические операции и арреи, то она 25 раз пытается найти какие либо совпадения с ключом и проксорить их со значением взятым из файла. Так как длина самого ключа 25 байт, то можем проксорить с нужными значениями, которые были взяты ярой, отследить их можно так-же через дебаг или посчитать в статике:

Решения CTF 2023 от «Доктор Веб». Часть 431


Значение из файла всегда подгружается в r1:

Решения CTF 2023 от «Доктор Веб». Часть 432


Составляем следующую последовательность:

Решения CTF 2023 от «Доктор Веб». Часть 433


Флаг: DrWeb{Y4r4_Rul35_P4DD1N6}

P.S. Можно еще попробовать различные библиотеки, особенно питоновские, есть шансы, что они смогут распаристь яру по своим локальным переменным, но это не точно. Главное всегда соблюдать нужную версию арены, для исполнения яра скриптов.

2. My first GUI​


Запускаем таску и видим следующее:

Решения CTF 2023 от «Доктор Веб». Часть 434


Просто форма и картинка с издевкой… Первое, что надо сделать — проверить, на чем написан семпл:

Решения CTF 2023 от «Доктор Веб». Часть 435


Проходимся по функциям в IDA, находим следующее, тут мы видим странные константы и вызов функции после (до функции можно дойти изучив структуру MFC или пройдясь по импортам с конца):

Решения CTF 2023 от «Доктор Веб». Часть 436


Далее мы весьма быстро находим простую проверку на дебаг:

Решения CTF 2023 от «Доктор Веб». Часть 437


А внутри цикла выше, если походить по функциям, можно обнаружить ошибку, которая указывает на то, что в качестве перменной используется вектор:

Решения CTF 2023 от «Доктор Веб». Часть 438


Далее стоит обратить внимание на загрузки неких ресурсов:

Решения CTF 2023 от «Доктор Веб». Часть 439
Решения CTF 2023 от «Доктор Веб». Часть 440


Затем это передается в функцию с некоторым алгоритмом. Судя по константам и сдвигам, это очень напоминает base64 — тут же задается Algid для шифрования после:

Решения CTF 2023 от «Доктор Веб». Часть 441


Полученное значение используется для вычисления ключа RC2:

Решения CTF 2023 от «Доктор Веб». Часть 442


Теперь необходимо попробовать это отладить — расшифровать мусор.

Далее — внимательнее рассмотреть получения ключа. Можно увидеть, что за дефолтным алфавитом base64 следует другой:

Решения CTF 2023 от «Доктор Веб». Часть 443


IDA изначально неправильно определила алфавит, обозвав это одним целым массивом в 128 байт. Говорим IDA, как должно быть, и патчим код, меняя адрес алфавита на второй:

Решения CTF 2023 от «Доктор Веб». Часть 444


Опять ничего не получилось…

Стоило бы подумать, кто вообще использует алгоритм RC2 для шифрования и можно попробовать буквально пробрутить разные алгоритмы, поменяв Algid. Пару раз пропатчив

Как только мы поменяем алгоритм на RC4 — мы получаем наш флаг: DrWeb{m3g4_MFC_m0zg}

Скриптец на питоне для решения таска:

Решения CTF 2023 от «Доктор Веб». Часть 445


Флаг: DrWeb{m3g4_MFC_m0zg}

3. std::GetGud​


Если запустить исполняемый файл, он просит ввести флаг:

Решения CTF 2023 от «Доктор Веб». Часть 446


Перед открытием в IDA проверяем, что это за зверь:

Решения CTF 2023 от «Доктор Веб». Часть 447


Также надо посмотреть на бинарник — он 64-х битный. При открытии IDA сразу обращают на себя внимание std::-функции.

Решения CTF 2023 от «Доктор Веб». Часть 448


Этот код можно распарсить на структуры и переименовать их — но здесь мы опишем быстрое решение таска, а не реверс с восстановлением рабочих сорсов.

Для неопытного реверс-инженера сложности могут возникать из-за обильных конструкций, которые визуалка компилирует при работе с C++.

Если пройтись по функциям, можно наткнуться на явную инициализацию ключа:

Решения CTF 2023 от «Доктор Веб». Часть 449


Return идет в следующую функцию, которая занимается расшифровкой — строк не видно, и, судя по всеми, именно она их и расшифровывает:

Решения CTF 2023 от «Доктор Веб». Часть 450


Оказалось это не ключ, больше похоже на строку, которую будем расшифровывать.

Функция расшифровки вызывается несколько раз, с разной инициализацией зашифрованных данных. Расшифрованная строка:

Решения CTF 2023 от «Доктор Веб». Часть 451


Теперь мы знаем, что это ввод флага, то просто ищем куда этот ввод мог бы пойти:

Решения CTF 2023 от «Доктор Веб». Часть 452


Натыкаемся на весьма странную пелену математических операций с байтами:

Решения CTF 2023 от «Доктор Веб». Часть 453


Его можно чуть-чуть восстановить:

Решения CTF 2023 от «Доктор Веб». Часть 454


Но далее суть проста: анализируем код, считаем операции, получаем флаг, который можно использовать для решения!

Решения CTF 2023 от «Доктор Веб». Часть 455


Флаг: DrWeb{Tr0j4n.S1gg5n.1337}

4. So low, so deep​


Открываем файл и видим следующее:

Решения CTF 2023 от «Доктор Веб». Часть 456


Здесь можно распознать IL код для .NET, в случае, если решающий не знает про IL код, то можно погуглить названия некоторых функций и быстро его распознать.

Чтобы сильно не трудиться над декомпиляцией этого кода используем онлайн инструмент sharplab.io:

Решения CTF 2023 от «Доктор Веб». Часть 457


Подгружаем туда наш код и видим подобные ошибки:

Решения CTF 2023 от «Доктор Веб». Часть 458


Если присмотреться, то можно понять, что ошибки возникают в частности в try-catch блоках, из-за весьма странных и невалидных инструкций

Решения CTF 2023 от «Доктор Веб». Часть 459


Больше всего вопросов вызывают эти два фрагмента:

Решения CTF 2023 от «Доктор Веб». Часть 460
Решения CTF 2023 от «Доктор Веб». Часть 461


Но легче, возможно, будет в целом вырезать все try-catch и поправить стек. Почистив код, можно получить следующее:

Решения CTF 2023 от «Доктор Веб». Часть 462


Ключ находится здесь — его можно опознать по IL-коду, сравнив с C# кодом:

Решения CTF 2023 от «Доктор Веб». Часть 463


Декодируем флаг.

Флаг: DrWeb{5h4rp_bu7_l0w_LvL}

5. OhMyZip​


Открывая этот файл у себя, все, что нам высветится это сообщение “LoL, you have been hacked”. Посмотрев на файл можно понять, что этодолжен быть самораспаковывающийся 7z архив, который явно не предпологался для запускания подобного.

Решения CTF 2023 от «Доктор Веб». Часть 464


Можно поискать в файле аномалии — особенно если есть опыт в вирусном анализе. В исполняемом файле оказывается совершенно лишняя секция:

Решения CTF 2023 от «Доктор Веб». Часть 465


Вот эта самая секция, отделенная паддингом из нулей:

Решения CTF 2023 от «Доктор Веб». Часть 466


Сам «малварный» код обфусцирован вермишелью из джампов и дешифровки, и смотреть его в статике не имеет смысла — особенно если он что-нибудь дропает:

Решения CTF 2023 от «Доктор Веб». Часть 467


А вот тот самый кусок кода, который вызывается недалеко от точки входа и который вызывает наш “малварный” код из лишней PE секции:

Решения CTF 2023 от «Доктор Веб». Часть 468


Просто бегая по инструкциям находим адрес, с которого качается пейлоад:

Решения CTF 2023 от «Доктор Веб». Часть 469


Можно скачать этот пейлоад и найти PowerShell -скрипт, который сообщал “LoL, you have been hacked”. Если запустить скрипт, то он не выведет флаг — он падает в конструкции try-catch:

Решения CTF 2023 от «Доктор Веб». Часть 470


Необходимо найти кусок кода, который здесь вызывается неявно, и декодировать его — в данном случае это функция “[jdasnklgsnfglsn.dfgsfdgsv3c]::fdsvfbsdfbsfd()”.

Раскодировав этот кусок, можно найти там цельную функцию C#, которая отвечает за загрузку второго пейлоада:

Решения CTF 2023 от «Доктор Веб». Часть 471


В загруженном файле видим такую строку в base64, окруженную “_”:

Решения CTF 2023 от «Доктор Веб». Часть 472


Чтобы заставить код расшифровываться, а не выплевывать ошибку, придется подумать, мы имеем bas64 строку, которая совпадает по размеру (после декодировки) для ключа шифрования, следовательно, убираем лишние функции для кодировки, которые мешали нам запустить код и запускаем:

Решения CTF 2023 от «Доктор Веб». Часть 473


После расшифровки получается такой кусок данных в base64:

Решения CTF 2023 от «Доктор Веб». Часть 474


Декодируем Base64 и получаем такой шеллкод, опять на PowerShell:

Решения CTF 2023 от «Доктор Веб». Часть 475


И далее запускается видео:

Решения CTF 2023 от «Доктор Веб». Часть 476


И высвечивается флаг:

Решения CTF 2023 от «Доктор Веб». Часть 477


Флаг: DrWeb{p0w3r5h3ll.d0wnl04d3r.65536}
 
198 160Темы
635 131Сообщения
3 618 411Пользователи
Semifistokl22Новый пользователь
Верх