Новости RuCTF 2010 Quals .::. Разбор Reversing .::.

blackzert
, 10 марта 2010

Перехвачу эстафетную палочку. Из всех rev мы решили 100, 300, 500. Пройдусь по всем.

Итак, пятница, 21:00, 203 аудитория, компутер, реверсинг, сон...

Открылись такски и конечно же ничто иное - 100.

Reversing 100.

скачивает файл - reversing100.jar. Java class - байткод явы. Прекрасно перегоняется как в байткод так и из него. Скачали jd, воткнули. 3 файла - два декомпильнулись, один брыкается. Странно. Глядим main - оно грузило второй, который дешифровывал третьий ( xor с 0x0С каждый байт ), а потом, дешифрованый, спокойно исполнял. Дешифровали, открыли - где то там был ответ. +100. Начало хорошее, качаем 200.

Reversing 200.

Скачиваем - banner.swf. В задании написано что это какой-то троян flash и надо найти мыльник автора. Искали всевозможные декомпиляторы flash, но они как то странно неработали - показывали что есть фрейм, который тупо белый квадрат, показывали что есть чтото еще.. Поставили качаца 13 мегов еще одного декомпиля, но ждать это как то долговато - решили поискать Online flash decompiler. И о чудо! есть такое - showmycode.com. Я начинаю думать, что скоро будут C декомпиляторы online - тенденция ведёт к тому. Этот декомпилятор очень помог с реверсом action script3.

Суть флэшки была в том, что она по узнавала версию Windows на машине, и в соответствии с версией выбирала флэшку-эксплоит. И воспроизводила. Флэшки эти хранились в виде строк вида "455311..." где цифры по две собирались в  0xab а потом переводились в инт. какбе хэш коды. погипнотизировали и пошли спать.

Пошли спать всем составом - причём решили таки выспаться. Аха, щас...В промежутке между 23 и 8 часами как то сложно выспаться ( надо же еще и в душ, и поесть, и таски порешать...)

Вернулся я часам к 9 - к тому времени соперники уже много что пооткрывали, отчего считали себя мега супер госу - ну пусть считают - наш секрет в том что мы не торопимся... +)) Пока они решали, мы спали. теперь спят они, а решать будем мы, причем уже будем знать - где простое, а где и нет.

В общем собрал я эти флэшки по частям.. И чтото они как то не декомпилятся(топишь скрипта в них никакого не было).. как то не фортово. Решил перейти к 300... Потом уже, ближе к обеду сего дня, вернулся костя, который за ночь успел прокурить спецификацию формата flash. Он заметил, что в каждой из флэх, 100 байт в конце различаются сильно, и они не по спецификации ( по ней на 100 меньше должны быть флешки). Разобрали, собрали... И чото както в основном печатуемые символы.. только бред.. Надо было отдать стенографам или форенсикам.. но чот им итак весело было... мы же реверсеры - хз чо с этим делать - это не байт код)))

Reversing 300.

Чтото я не помну.. помоему это все таки был день первый.. точнее ночь первая.. В общем, ночь, не спиться... 3 ночи.. Зашел на сайт, глянул чо по реверсингу - 300 открылся. айс. ща ка я его :). Костя в аське усердно курил спецификацию к флэшу и ругался (местами цензурно) на оный..

Итак, какая то тулза для генерации паролей, и мол надо сгенерировать пароль для парня с именем каким то там. Итак, кидаю его в иду, анализирую. Код, код, код.. пароля нет :).. начал отлаживать. трассировать.. Дошел до места, где применяется shellexec..Сработала сигнализация - это не к добру. глянул в стек - лежала строка "date 3 10 2020".. Ну  нифига се - еще дату мою смените..ориентировал eip строчкой ниже, и продолжел своё действо. Дальше пошла какая то чумная функция - она брала текущую дату, проверяла, ждала, снова брала, снова проверяла, снова чтото проверяла... по выходу стоял выбор - либо вернется 1 и программа завершится с ссобщением дескать "ваша прога непростительно стара", либо 0 и чтото дальше пойдет. ну ок, eax в ноль и продолжаем. Дальше у нас попросили логин, а мы ввели. А дальше код, который я уже скоро средь сна узнаю - длинный ассемблерный листинг md5... От строки что прочли.. Как то неприкольно.. ну пофиг больше вроде никаких подводных камне нету, и можно смело нажать f9, окончив тем самым трассировку. Я и нажал. В ответ полчуил "Use this %user: %hash" где user - это тот самый пользер, а hash - хэш  =) сказал косте брутануть хэшь, попробовал сдать его (и видимо зацепил еше символ \n) и у меня не приняли его... ацтой =(. На все эти действия ушло минут 10 ( я особо не вникал что делает программка, я так... баловался). Проверил и о чудо md5(%user)==%hash. Сказал косте остановить брут. Пошел спать.

Утро, 8. ( в 7 я себя так и не поднял). Сел снова за этот бинарь. Полностью все восстановил, но ничего кроме вывода md5 так и не увидил(я о полезном..)) ).. отчаялся. стал искать что ето за имя такое в гугл ( оказывается, это руна какая то немецка, и что это чтото вроде злобы..Вы, Организаторы, откуда это выцепили? и зачем?.. ). В общем перед выходом кинул md5 снова и ура - я сдал. =) Пошел в универ, решать там.

А там... Костя с флешкой и rev 400... Ну костя пусть остаётся с флэшкой, а я на 400 гляну.

Reversing 400.

Задание Omar.plc. Дан файл надо указать промежуток, где алгоритм некорректен. Стал искать, что же такое plc. После долгих поисков впустую, решил что это таки perl compiled. причом первая строка use ByteLoader 0.7 сдавала перл с потрохами. Это байт код перла. Его генерирует и дизассемблирует класс B::C, который и был вскоре установлен на сервак волонга ( 64 Битный перл был только там под рукой...ах, да, он был еще и 64 битным..). Декмопильнули... и... и... и.. чойто за..??Оо.. спецификации по байткоду перла нет, как устроена виртуальная машина также непонять.. кароче реверсинга тут больше нет, а перлоиды наши... ну в общем админили кто где. Файлик же не запускался - ругался на недопустимый диапозон SV в който верхней строке. Как я понял sv - чтото вроде регистра.. Conclusion - perl is write only...

Жури позже дали хинт на таск - Omar превратился в Omar Hayam... помогло :))))

Reversing 500.

Время к обеду во внешнем мире. У нас же.. просто время ). Пришел Марк. Мы с ним пошли в отдельную аудиторию компать 500 реверс. Красота - 2 реверсира и ничего больше.. никто не взрывает мозг и не отвлекает.. ухх )) Задание - дана строка, известно что она - часть пароля. Есть программа, что проверяет пароли на вшивость. Нужен весь пароль. причом именно этот.

Итак, прога читала строку, чото с ней делал и возращал либо 0, если строка прально составлена, либо 1, если строка не пароль, и падал с нарушением сегментации, если строка вобще кардинально неадекватна. И всё ничо, но на то, что нам дали изначально, она возращала 0... Потом оказалось, что строка таки была верная, и, жюри, заметив это, выдало новую, неполную.. можно играть дальше :)

Судя по внешнему виду и peid, это visual studio, причом с stl и оптимизацией на борту... (нет лучшей обфускации..).. Чуть ли не стразу, мы поняли, что первые 2 символа строки отвечают за число циклов и число прочитаных далее символов. Научились формировать более менее валидные строки ( приложение не падало невесть куда). Дальше с отлатчиком и идой , опняли что оно строит какие то структуры по этой строке, а потом их как то использует, проверяя тем самым может ли это быть паролем или нет.. Итак у нас был пароль, у нас бы незаонченый пароль, у нас был бинарик.. подавали на вход разну дрянь,, получали что в некоторых if алгоритм сравнивает одни и теже места ( через сколь ко то букв).. Не утомляя подробностями, мы поняли, как обойти первую сеть проверок. оставалось еще 2... сэтим опшли по домам, ибо уже вечер первых суток был.. Я решил написать брутилку, вдруг пароль найдется ( генерировал случайтно). Однако, когда я только написал оную, марк прислал мессагу, что сдал.. на вопрос как - сказал, что просто аналогичную составил строчку.. возражать я не стал. Сдали значит сдали :)

Далее ночь развивалась уже в сторону CTB500. Марк напал на него, чуть перекинувшись словами, я заметил, что если куки вырубить ( те самые, что авторизовали команду), то можно отправлять запросы чаще чем раз в минуту  ( было там такое ограничение)...Анонимайзеры рулят:)

Я пошел спать, а Марк радостно сообщил в 6 что он сдал... ну в общем вы у него спросите:)