Как известно, важной частью борьбы с киберугрозами является расследование вредоносных файлов, чем и занимаются наши вирусные аналитики — отважные ребята (и девушки!) из команды Anti-Malware. Основываясь на своем опыте, они регулярно создать специальные симуляторы CrackMe, с помощью которых начинающие аналитики смогут проверить свои знания.
Не так давно мы анонсировали конкурс CrackMe, который проводится в рамках ивент-платформы CoLaboratory. Теперь, когда конкурс завершен и все решения приняты, можно рассмотреть задания более подробно.
ВНИМАНИЕ: Если вы не успели поучаствовать в конкурсе, но все же хотите попробовать свои силы, не читайте информацию под катом.
Там мы описываем алгоритм решения задачи.
Вы можете скачать последние задания CrackMe Здесь .
Решение CRACKME#1
Итак, зима КРЕКМЕ#1 из «Лаборатории Касперского».Когда мы запускаем файл, нас встречает это простое окно с просьбой ввести данные для решения.
Вам необходимо ввести электронную почту, с которой вы регистрировались на сайте, и выбрать для нее ключ.
Если вы введете неверное значение, окно будет ругаться — вам придется решать.
Для нашего увлекательного исследования мы будем использовать (барабанная дробь!) только IDA Pro, это так просто.
В результате мы видим вполне стандартную для оконного приложения картинку.
Вот фрагмент WinMain, который делает всю магию.
Функция DialogBoxParamW принимает бла-бла-бла в качестве входных параметров.
Повторять документацию думаю излишне, поэтому просто идем по адресу, который содержит функцию, которая что-то сделает, если мы нажмем кнопку «Проверить».
Чтобы понять, насколько все просто, посмотрите на картинку выше, на которой изображена та самая волшебная функция.
По сути, это всего лишь набор кода, который показывает нам сообщение «Серийный номер недействителен», если мы вводим неправильные данные.
Обилие стандартных названий различных структур, например «ms_exc.registration.TryLevel» говорит о том, что Crackme написан на C++, именно так структура (try-catch) выглядит изнутри и скорее всего это вызовы к этой структуре, которая будет окружать код, выполняющий манипуляции с входными данными.
Если параллельно с чтением вы следили за ходом мыслей в окне IDA, то наверняка уже нашли нужное нам место.
Переходим к единственной функции между вызовами «ms_exc.registration.TryLevel» и вуаля — мы у основной функции, которая определяет, правильно или неправильно мы нашли ключ для нашей почты.
Для концентрации и красивого отображения вершины графа на рисунке выше сгруппированы, чтобы было понятно, какая часть за что отвечает. Обычная конструкция if-else.
Давайте сосредоточимся на верхней части графика «Получить текст и проверить».
Единственное, на что мы обратим внимание из этого сгруппированного блока, — это этот фрагмент листинга.
Если мы внимательно посмотрим на приведенные выше команды, то увидим, что полученные поля EMail и Serial сохраняются в памяти.
На картинке выше показаны команды, которые записывают адреса полученных данных в регистры ECX и EDX соответственно.
И тут начинается проверка, собственно, это ее график и изображен ниже.
Впечатляет, но огромный размер графа с многочисленными ветвями может быть просто способом запутать код мусорными командами.
Так что не расстраивайтесь, берите лопату и отправляйтесь искать клад. Начинаем просеивать «почву».
Сразу бросается в глаза большое количество команд с адресов 0040DC00 по 0040DC86, которые, на первый взгляд, делают что-то математически важное для проверки нашего ключа.
Однако если присмотреться, то можно понять, что это пары команд, компенсирующих действия друг друга.
Весь диапазон можно представить как одну большую команду nop, давайте ее пропустим.
Возьмем следующий содержательный модуль.
Код, содержащийся в этом модуле, не был признан стандартным, но все выполняемые им операции просто преобразуют строки из Wide string в просто строку.
Для удобства переименуем вызываемые функции, а анализ внутренностей оставим для особо любознательных читателей.
Особое внимание обратим только на функцию с кодовым названием «Md5».
Почему мы назвали это так? Заглянем внутрь и, чтобы не перегружать статью картинками и пояснениями к каждой строчке листинга, посмотрим только необходимый кусок.
Код довольно простой, поэтому, чтобы понять, что происходит, достаточно прочитать названия функций WinApi. На картинке вы видите блок, по которому мы можем определить, КАКОЙ алгоритм вообще реализован этой функцией.
Покопавшись в официальной документации, находим значение 8003h для константы «CALG_MD5».
Комментарии не нужны.
Перейдем к следующему модулю.
Он содержит цикл.
Он показывает, что цикл перебирает последовательность данных в памяти, используя две переменные, значения которых отступлены на 16 позиций друг от друга.
Операция XOR выполняется над каждым элементом последовательности, отстоящим от него на 16 символов.
Сумма MD5 рассчитывается на основе полученного результата.
Следующий модуль, который стоит рассмотреть, выглядит так:
Модуль сравнивает две переменные, засорен командами и в конце сравнивает значения переменной и значения регистра ebx (условие сравнения длин последовательностей?).
В результате происходит переход к циклу, который в модуле представлен на картинке ниже.
Он выполняет сравнение последовательности из 16 символов, увеличивая счетчик на единицу, если есть совпадение, и уменьшая на единицу в противном случае.
(Это операция сравнения полученного Serial с исходным, который был рассчитан и сохранен в памяти).
После этого цикла происходит инициализация, и мы видим зеркальный цикл, который начинается не с нуля, а с 16-го символа.
Изображение показано ниже.
После обработки последовательности в цикле среди замусоренного кода и стандартных процедур находится модуль, принимающий решение на основе сравнения двух переменных.
Не стоит даже слишком много вчитываться в дизассемблированный код. Это сравнение совпадений двух строк Serial и вычисленного значения на основе введенной почты.
Изображение модуля представлено ниже.
Чтобы проверить результаты нашего исследования, попробуем самостоятельно манипулировать введенным адресом электронной почты:
1. получить сумму Md5 с адреса;
2. разделите полученную сумму пополам и выполните операцию xor,
3. По результату еще раз посчитаем Md5.
Был использован экспериментальный адрес электронной почты: [email protected].
Используемый серийный номер: BB23F6DFA9375ED119237AAC4DE31BCD.
Результат на картинке ниже
Вот простой CRACKME.
Решение CRACKME#2
Во второй трещине нам дан бинарный файл (PE 32-битный).И снова вам нужно выбрать правильный серийный номер для электронной почты.
Сначала откройте этот файл в приведенном выше ИДА .
Также полезно использовать при анализе Шестнадцатеричные лучи (удобный декомпилятор, поддерживающий множество архитектур).
Мы можем найти место, где проверяется серийный номер.
По адресу 40E960 (не считая ASLR) находится функция тестирования.
Вначале вы можете видеть, что электронное письмо сжимается до размера 22 байт путем xoring всех символов, позиции которых равны по модулю 22. В случае нехватки оно расширяется нулевыми байтами.
Затем проверяется, что серийный номер находится в шестнадцатеричной системе счисления, он преобразуется в байты и над ним также выполняется операция xor с адресом почты.
Затем мы проверяем, что полученная сумма xor удовлетворяет СЛАУ , который использует коды символов ASCII для некоторого внутреннего секретного значения.
Уравнений в СЛАУ много, поэтому необходимо рассмотреть какой-то метод автоматического решения.
Для этого можно использовать систему компьютерной математики (например NumPy ), или так называемый решатель SMT z3 , который мгновенно находит решение.
Вы также можете попробовать решить СЛАУ, используя фреймворк гнев , который уже содержит z3. В авторском решении используется z3. Но не забывайте, что любую СЛАУ можно решить на бумаге методом Гаусса, нужно только постараться.
Решив СЛАУ, мы получаем секретное значение «KL_F4n7a5tiC_chAl1eN63», которому должен быть равен этот xor всего.
Пример:
Электронная почта: [email protected]
Серийный номер: 382d3236580b770a540719262d10033842520a233633
Ну вот и все.
Мы рассмотрели два из трёх CrackMe зимнего сезона от «Лаборатории Касперского».
Но не будем раскрывать всех секретов.
Вполне вероятно что третий CrackMe мы продолжим использовать это как тестовое задание.
Итак, если вы хотите сделать карьеру вирусного аналитика, попробуйте решить эту проблему самостоятельно.
Скоро на нашем сайте появится больше CrackMe, видеовстреч, хакатонов и других мероприятий.
Веб-сайт .
Присоединяйтесь к нам! Теги: #информационная безопасность #обратное проектирование #обратное проектирование #лаборатория Касперского #информационная безопасность #для начинающих
-
Математика Цен И Ценностей
19 Oct, 24 -
Nigma.ru Тестирует Новую Версию
19 Oct, 24 -
Анонимные Сети И Временные Атаки: Введение
19 Oct, 24 -
Workflowsoft: История Нашей Дружбы
19 Oct, 24 -
Эдвард Сноуден Использовал Дистрибутив Tails
19 Oct, 24