Hack3r VM на Real CTF 2019

Привет из МИЭМа

ctf reverse

Итак, вот и подошел к концу RealCTF. Самое время выложить разбор тасков, которые мне показались интересными.

Это была одна из самых прикольных (и жизненных, все же) CTF за последнее время. Формат тоже порадовал — таски делились на своеобразные ветки. К примеру, сайтик, на котором в разных местах раскиданы флаги, виртульная машина (которую мы сейчас и разберем) и так далее. Ну что же, хватит лирики и разберем одну из самых интересных веток (на мой взгляд). Ссылка на машину, для интересующихся.

PassMon и passTheH@cker

Изначально, как написали сами орги, идея таски была вообще другой, но, из-за косяка реализации обе таски решались одновременно и очень просто — даже без монтирование харда ищем в стрингах харда строку "HSE{"

Нечто странное и кусочек еще какого-то флага

Пытаемся сдать нечто HSE{this_is_just_an_ordinary_flag_seems_ok_????}, мало похожее на флаг, но вдруг прокатит? Не прокатило. Тогда открываем файлик любым текстовым редактором и ищем "HSE{".

На этот шаг меня натолкнула мысль, что очень часто в stdin не попадают строки из-за каких-то управляющих последовательностей. По-хорошему, с этого стоило бы начать. С открытия в редакторе.

По дальнейшему изучение дампа оперативы стало понянто, что это файлик Tasks.txt, лежащий на рабочем столе

Спустя немного брута понимаем, что ^G^@ это e_. Итак, мы откопали первый флаг от, как оказалось, passTheH@cker. Сам флаг HSE{9od5_jU5t1cE_w1ll_be_d0ne_oveR_yoU_H4rU64tOp}.

Двигаемся дальше. С вмкой в комплекте идет снапшот — накатываем его и повторяем операцию. Получаем флаг от PassMon:

Вот так вот самый сложный, по задмке, таск стал самым простым

Возможно, чуть позже я распишу, как честно решить PassMon. Тут есть два флага — один фейковый и один настоящий. Сдавать надо было HSE{4lLl_y0UR_ICq_P422w0rD5_4r3_H3Ck3D}.

Flagger

Как мы видели в файлике с описанием задач у нас есть еще над чем поломать голову — это Flagger, D’RA и Kektor3000. Начнем по возрастанию сложности, с Flagger.

Тут небольшое уточнение — я так и не запустил виртуалку, так что это таски я достал просто через примонтирование файлика-харда. По-честному, надо было запустить

Видим, что в папке C:\Flagger лежат три файлика

Ну что же, посмотрим, что из себя представляет Flag.exe

Ух, люблю плюсы

Программа представляет из себя декриптор флага — на вход просит флаг и ключ. При этом, судя по всему, читает их не из файла, а, значит, давать имена файлов бесполезно. Нужно каким-то образом давать их содержимое. Даже непечатаемые символы. Печально, смотрим дальше. Возможно, есть все же какой-то способ засунуть в декриптер наши файлы. Писать свой вообще не улыбается. Можно заметить, что в какой-то момент вызывается функция fcn.00401180 , принимающая два указателя на строки (два lea недвусмысленно намекают на это), причем одна из строк это та, в которую мы считали введенный флаг. Вскрываем(ся).

Хм. 16-ричные числа как бы намекают.

После некоторого времени ее анализа я понял, что функция принимает два аргумента — строку-донор и строку, в которую будет записан итог. Сначала строка-донор проверяется, действительно ли она является hex-строкой, а после этого идет декод из hex’a в бинарщину. Это похоже на решение! Попробуем скормить этой штуке содержимое файликов в hex-виде.

Вот так и рождаются нездоровые интриги. Слишком много служебного от вайна, надо пофиксить, да

Ура, мы получили флаг HSE{d0n7_7ry_7o_h1d3}. С моей точки зрения — задача абсолютно оправданной сложности за свою цену. Двигаемся дальше.

D’RA

С самого начала оговорюсь — такого удовольствия, как от реверса этой таски я не получал уже очень давно. Почему — поймем по ходу райтапа :)

Опять в корне диска C валяется папка с веселым названием D'RA и одним-единственным экзешником внутри. Ну, что же, приступим к ковырянию. Для начала, просто попробуем запустить это чудо и посмотрим, что он нам выдаст:

Приятно, когда с тобой хотят познакомиться

Окей, нас считают чужими. Пойдем внутрь, чтобы понять, как стать “своими”.

От реверса на реале осталось ровно одно ощущение. Слишком. Много. Плюсов :)

После приглашения и предложения познакомится видим еще один ввод и потом сравнение введенной строки со строкой M4S73R 53NP41. Так программа ищет своего семпая! Значит, обманем наивную девушку с притворимся ее семпаем.

Оказывается, все не так просто

Хм. Значит, нам нужно ввести еще какую-то строку, чтобы получить флаг. А что если ввести рандомную?

Спалили :(

Окей. Скорее всего, флаг лежит где-то в секции .rdata. Попробуем ее поковырять. Действительно, там валяется нечто, оооочень сильно похожее на флаг REAL{0HHHHHH_D0N7_70UCH_M3_7H3r3_PL3333453333}. Пытаемся сдать — режект. Значит, что-то еще происходит с этой строкой.

Warning! Дальше решение от ленивого реверсера!

Если внимательно посмотреть — после предложения ввести секретную фразу вызывается функция fcn.00401050. Попробуем посмотреть, что она из себя представляет (спойлер — обычный switch-case)

А вот и вывод фейкового флага

Немного покопавшись, находим нужный кусок — xor двух строк, одна из которых представляет из себя тот самый “флаг”, который мы пытались сдать. Пишем простенький скрипт и получаем флаг REAL{4HH_MY_53NP411111_I_4M_Y0Ur_F146_74K3_M3}. Могу сказать ровно одно — @fuunyaka конкретно запарился, когда делал этот таск :D

К сожалению, еще один таск из этой ветки — Kektor3000 я так и не решил. Ждем райтапа от SusloPAS, единственных, решивших этот таск :)

Всем удачи на стфках, да прибудет с вами сила!

Previous Post Next Post