Райтап Rev с DEF CON 2017
Райтап был написан Revervand'ом.
Magic.
Нам дано 200 бинарников и сервис, который запрашивает значения для каждого из этих бинарников. Смысл задания был найти функцию проверки значения для каждого из файла.
Найти функцию проверки было довольно просто. Идём в main(), видим вызов некой функции перед принтом сообщения “sum is:%ld”.
Анализируем sub_DF6().
Сразу видим, что каждое значение получается после вызова неких функций. Если загрузить другой бинарь, то картина будет та же. Перейдём в первую функцию – sub_93B().
Видим, что эта функция в тупую сравнивает значение с константой. И далее видим другие функции, которые также это делают. Откроем другой файл, и увидим, что адрес первой функции сравнения точно такой же как в 1 нашем файле – значит это и есть функции проверки контрольного значения для файла.
Т.к. нам дано 200 файлов, нужно сделать некую автоматизацию данного процесса. Пути решения могут быть разные. Я выбрал анализ файлов по опкодам.
Смысл метода заключается в том, что мы считываем данные из каждого файла с определённого смещения, находим опкоды операции сравнения и генерируем контрольное значение.
Найдём опкод инструкции сравнения(cmp). Этот опкод – 48 83 ff n, где n – значение с которым происходит сравнение. Найти опкод можно при синхронизации IDA View и Hex View.
Теперь, когда мы знаем всё что нужно, можно писать скрипт для автоматизации.
В файле – list.txt хранятся имена всех файлов. Возможны некие ошибки, но большая часть значений была посчитана верно, сервис проверял не все файлы, а лишь некую часть.
Sorcery.
Следующее по сложности задание, однако смысл его остался таким же и методика действия почти такая же. В данном задание было не несколько функций проверок, а одна. Её можно было найти путём простого перебора, т.к. у вас есть 200 файлов и в них точна должна быть закономерность для какой-либо функции. Прямо перед функцией main(), есть функция sub_30FC().
Просматриваю функцию sub_30FC(), можно наткнуться на некий блок сравнений, который разный у разных файлов.
Сравнений не много, поэтому можно просто проверить с помощью данного нам сервиса, верно ли наше предположение. После проверки понимаем, что мы правильно нашли функцию. И опять нам нужно автоматизировать наши действия.
Казалось бы, здесь всё также, как и в первом задание, но есть небольшой нюанс – последнее сравнение происходит с другим регистром, нежели всё остальные. Поэтому добавится ещё одно условие. Также добавится условие окончания функции.
Находим опкоды таким же способом, что и в задание “magic”.
Часть кода, отвечающая за связь с сервисом – осталась такой же, чуть поменялась часть проверки инструкции.
Alchemy.
Более сложное, но абсолютно идентичное задание, которое опять-таки сведётся к поиску одной функции и анализу опкодов.
В main(), сразу видим первую вызываемую функцию в которую передаются в качестве аргументов, аргументы передаваемы файлу при запуске. Это функция sub_40D760().
Анализирую функцию sub_40D760() опять натыкаемся на огромный блок сравнения.
Абсолютно такие же действия, как и в прошлым заданиях, меняются лишь опкоды инструкций сравнения и опкоды, сигнализирующие об окончании блока.
Часть кода, отвечающая за связь с сервисом – такая же, как и в прошлых заданиях. Здесь были некие ошибки, но опять-таки нам не обязательно решать все 200 файлов, чтоб пройти проверки на сервисе.
Witchcraft.
Задание из той же категории, с такой же идей, но уже более сложное, чем остальные. Нужно опять найти функцию проверки, или функции. При просмотре main(), можно найти функцию – sub_406190().
Переходим в неё, и видим некий блок вызовов различных функций и применение к их результатам одинаковых операций, но сравнений пока что не видно.
Проверим, что в этих функциях. Например в sub_402120().
Вот это уже интересно. Видим две операции: сложение и вычитание. Теперь нужно понять к чему они.
Вот и оно, в конце видим сравнение с неким значением и возврат его. Значит в функцию поступает некое число, которое проходит ряд преобразований и получается в итоге возвращаемое число. Нужно обратить все операции в функции и получить начальное значение – это и будет код символа, который нам нужен.
Итак, нам нужны 2 опкода отвечающие за операции сложения и вычитания, опкод сравнения, а также опкод окончания данного блока функций. Получаем их нашим старым способом и автоматизируем.
Есть ещё небольшие нюансы, которые связаны с преобразованием отрицательных значений, но я соорудил небольшие костыли, которые правда не до конца правильно сработали, но задание всё же удалось решить.
Из всего дампа выдирается функция, анализируется её окончательное значение, потом анализируются действия и выполняются преобразования.
Ошибок было довольно много, они были связаны с неверным преобразованием отрицательны числе меньше чем -255, но т.к. было уже поздно и мне было лень что-то переделывать, я просто запустил бесконечный цикл, в котором происходило подключение и по имеющимся верным значениям осуществлялись попытки получить флаг, после примерно 3 минут флаг был получен.
- Автор: drakylar
- Комментарии: 0
- Просмотры: 4595