Итак, вот и подошел к концу RealCTF. Самое время выложить разбор тасков, которые мне показались интересными.
Это была одна из самых прикольных (и жизненных, все же) CTF за последнее время. Формат тоже порадовал — таски делились на своеобразные ветки. К примеру, сайтик, на котором в разных местах раскиданы флаги, виртульная машина (которую мы сейчас и разберем) и так далее. Ну что же, хватит лирики и разберем одну из самых интересных веток (на мой взгляд). Ссылка на машину, для интересующихся.
Изначально, как написали сами орги, идея таски была вообще другой, но, из-за косяка реализации обе таски решались одновременно и очень просто — даже без монтирование харда ищем в стрингах харда строку "HSE{"
Пытаемся сдать нечто HSE{this_is_just_an_ordinary_flag_seems_ok_????}
, мало похожее на флаг, но вдруг прокатит? Не прокатило. Тогда открываем файлик любым текстовым редактором и ищем "HSE{"
.
На этот шаг меня натолкнула мысль, что очень часто в stdin не попадают строки из-за каких-то управляющих последовательностей. По-хорошему, с этого стоило бы начать. С открытия в редакторе.
Спустя немного брута понимаем, что ^G^@
это e_
. Итак, мы откопали первый флаг от, как оказалось, passTheH@cker. Сам флаг HSE{9od5_jU5t1cE_w1ll_be_d0ne_oveR_yoU_H4rU64tOp}
.
Двигаемся дальше. С вмкой в комплекте идет снапшот — накатываем его и повторяем операцию. Получаем флаг от PassMon:
Возможно, чуть позже я распишу, как честно решить PassMon. Тут есть два флага — один фейковый и один настоящий. Сдавать надо было HSE{4lLl_y0UR_ICq_P422w0rD5_4r3_H3Ck3D}
.
Как мы видели в файлике с описанием задач у нас есть еще над чем поломать голову — это Flagger, D’RA и Kektor3000. Начнем по возрастанию сложности, с Flagger.
Тут небольшое уточнение — я так и не запустил виртуалку, так что это таски я достал просто через примонтирование файлика-харда. По-честному, надо было запустить
Видим, что в папке C:\Flagger
лежат три файлика
Ну что же, посмотрим, что из себя представляет Flag.exe
Программа представляет из себя декриптор флага — на вход просит флаг и ключ. При этом, судя по всему, читает их не из файла, а, значит, давать имена файлов бесполезно. Нужно каким-то образом давать их содержимое. Даже непечатаемые символы. Печально, смотрим дальше. Возможно, есть все же какой-то способ засунуть в декриптер наши файлы. Писать свой вообще не улыбается. Можно заметить, что в какой-то момент вызывается функция fcn.00401180
, принимающая два указателя на строки (два lea недвусмысленно намекают на это), причем одна из строк это та, в которую мы считали введенный флаг. Вскрываем(ся).
После некоторого времени ее анализа я понял, что функция принимает два аргумента — строку-донор и строку, в которую будет записан итог. Сначала строка-донор проверяется, действительно ли она является hex-строкой, а после этого идет декод из hex’a в бинарщину. Это похоже на решение! Попробуем скормить этой штуке содержимое файликов в hex-виде.
Ура, мы получили флаг HSE{d0n7_7ry_7o_h1d3}
. С моей точки зрения — задача абсолютно оправданной сложности за свою цену. Двигаемся дальше.
С самого начала оговорюсь — такого удовольствия, как от реверса этой таски я не получал уже очень давно. Почему — поймем по ходу райтапа :)
Опять в корне диска 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, единственных, решивших этот таск :)
Всем удачи на стфках, да прибудет с вами сила!