Райтап Rev с DEF CON 2017

Райтап был написан Revervand'ом.

Magic.

Нам дано 200 бинарников и сервис, который запрашивает значения для каждого из этих бинарников. Смысл задания был найти функцию проверки значения для каждого из файла.

Найти функцию проверки было довольно просто. Идём в main(), видим вызов некой функции перед принтом сообщения “sum is:%ld”.


Райтап Rev с DEF CON 2017

Анализируем sub_DF6().
Райтап Rev с DEF CON 2017

Сразу видим, что каждое значение получается после вызова неких функций. Если загрузить другой бинарь, то картина будет та же. Перейдём в первую функцию – sub_93B().
Райтап Rev с DEF CON 2017

Видим, что эта функция в тупую сравнивает значение с константой. И далее видим другие функции, которые также это делают. Откроем другой файл, и увидим, что адрес первой функции сравнения точно такой же как в 1 нашем файле – значит это и есть функции проверки контрольного значения для файла.

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

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

Найдём опкод инструкции сравнения(cmp). Этот опкод – 48 83 ff n, где n – значение с которым происходит сравнение. Найти опкод можно при синхронизации IDA View и Hex View.

Райтап Rev с DEF CON 2017

Теперь, когда мы знаем всё что нужно, можно писать скрипт для автоматизации.
Райтап Rev с DEF CON 2017

В файле – list.txt хранятся имена всех файлов. Возможны некие ошибки, но большая часть значений была посчитана верно, сервис проверял не все файлы, а лишь некую часть.


Sorcery.

Следующее по сложности задание, однако смысл его остался таким же и методика действия почти такая же. В данном задание было не несколько функций проверок, а одна. Её можно было найти путём простого перебора, т.к. у вас есть 200 файлов и в них точна должна быть закономерность для какой-либо функции. Прямо перед функцией main(), есть функция sub_30FC().

Просматриваю функцию sub_30FC(), можно наткнуться на некий блок сравнений, который разный у разных файлов.

Райтап Rev с DEF CON 2017

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

Казалось бы, здесь всё также, как и в первом задание, но есть небольшой нюанс – последнее сравнение происходит с другим регистром, нежели всё остальные. Поэтому добавится ещё одно условие. Также добавится условие окончания функции.

Находим опкоды таким же способом, что и в задание “magic”.
Райтап Rev с DEF CON 2017

Часть кода, отвечающая за связь с сервисом – осталась такой же, чуть поменялась часть проверки инструкции.


Alchemy.

Более сложное, но абсолютно идентичное задание, которое опять-таки сведётся к поиску одной функции и анализу опкодов.

В main(), сразу видим первую вызываемую функцию в которую передаются в качестве аргументов, аргументы передаваемы файлу при запуске. Это функция sub_40D760().

Райтап Rev с DEF CON 2017


Анализирую функцию sub_40D760() опять натыкаемся на огромный блок сравнения.
Райтап Rev с DEF CON 2017

Абсолютно такие же действия, как и в прошлым заданиях, меняются лишь опкоды инструкций сравнения и опкоды, сигнализирующие об окончании блока.
Райтап Rev с DEF CON 2017

Часть кода, отвечающая за связь с сервисом – такая же, как и в прошлых заданиях. Здесь были некие ошибки, но опять-таки нам не обязательно решать все 200 файлов, чтоб пройти проверки на сервисе.


Witchcraft.

Задание из той же категории, с такой же идей, но уже более сложное, чем остальные. Нужно опять найти функцию проверки, или функции. При просмотре main(), можно найти функцию – sub_406190().

Райтап Rev с DEF CON 2017


Переходим в неё, и видим некий блок вызовов различных функций и применение к их результатам одинаковых операций, но сравнений пока что не видно.
Райтап Rev с DEF CON 2017

Проверим, что в этих функциях. Например в sub_402120().
Райтап Rev с DEF CON 2017

Вот это уже интересно. Видим две операции: сложение и вычитание. Теперь нужно понять к чему они.
Райтап Rev с DEF CON 2017


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

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

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

Райтап Rev с DEF CON 2017


Из всего дампа выдирается функция, анализируется её окончательное значение, потом анализируются действия и выполняются преобразования.

Ошибок было довольно много, они были связаны с неверным преобразованием отрицательны числе меньше чем -255, но т.к. было уже поздно и мне было лень что-то переделывать, я просто запустил бесконечный цикл, в котором происходило подключение и по имеющимся верным значениям осуществлялись попытки получить флаг, после примерно 3 минут флаг был получен.скачать dle 10.5фильмы бесплатно

  • Автор: drakylar
  • Комментарии: 0
  • Просмотры: 1757

Добавить комментарий

Вы не авторизованы и вам запрещено писать комментарии. Для расширенных возможностей зарегистрируйтесь!