Как стать автором
Поиск
Написать публикацию
Обновить

Yet another kaspersky crackme

Время на прочтение3 мин
Количество просмотров8.7K
Сей раз ЛК выпустила на свет шесть крякми, два из которых были написаны на человеческом языке С. Приступим к анализу. Линк, архив, семпл из статьи.

SHADOW
В описании к заданию написано:
«Ollydbg не спасет Вас, исследователи! Игра будет вестись в темных уголках ядра операционной системы. Хватит ли Вам смелости узнать потаенные места виртуальной реальности? Shadow ждет вас, найдите его!»
Намек ясен. Делаем пару прогонов анализаторами нашего образца:

Убрано под спойлер


Оке, все чисто. Cмотрим импорт:

Убрано под спойлер


На данном этапе, не копая дизасм листинг (он кст небольшой, см смещение 00402310), можно понять логику работы приложения:

  1. Подгружается драйвер (CreateService)
  2. Ему передаются некие параметры (DeviceIoControl)
  3. Драйвер что-то делает
  4. ???

Очевидно, нам необходимо выцепить драйвер. Загружаем r3 отладчик архетипа «Оля», ставим бряк на CreateServiceA, DeviceIoControl и клацаем F9 (антиотладка отсутствует). Сразу же срабатывает точка останова на CreateServiceA, вот так выглядит стек:

Убрано под спойлер


Замечаем путь к нашему драйверу, копируем его куда-нибудь. Клацаем F9, ловим еще одну остановку на этой же функции:

Убрано под спойлер


Вам может показаться, что это один и тот же драйвер, однако присмотритесь внимательнее: названия чуть-чуть отличаются. Его тоже сохраним. Клацаем F9, перед нами появляется консолька с просьбой ввести некие данные:

Убрано под спойлер


Вводим рандом, отправляем. Сразу же срабатывает бряк на DeviceIoControl:

Убрано под спойлер


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

Убрано под спойлер


Иными словами, если DeviceIoControl вернул ненулевое значение — крякми решен. Что ж, перейдем к изучению первого драйвера. DriverEntry:

Убрано под спойлер


Обработчик DeviceIoControl:

Убрано под спойлер


Заветная Validate:

Убрано под спойлер


Обратить эту функцию не составит труда. Однако давайте вспомним, что у нас существует и второй драйвер, про который мы пока ничего не знаем. Его DriverEntry:

Убрано под спойлер


Интересное кино! Выглядит как самый настоящий драйвер-фильтр. Глянем обработчик:

Убрано под спойлер


Что мы здесь видим:

  1. Функция ValidateStr отвечает за дополнительную валидацию наших первичных данных: допускаются только символы A..Z + a..z + 0..9 + '.' + '@'. Я бы оторвал руки человеку, который добавил такую проверку — лично мой меил не проходит ее, в нем содержится символ '-'
  2. Функция ModifyMail изменяет наш меил следующим образом:

    Убрано под спойлер

  3. IofCallDriver передает управление основному драйверу с уже измененными данными

Таким образом, учтя все проверки, можно набросать что-то типа этого:

Убрано под спойлер
#include "main.h"

char mail[257];
char hashes[32][33];

void main()
{
	for (;;)
	{
		printf_s("Enter your name (1 chars min and 256 chars max, only A..Z + a..z + '.' + '@'):\n");
		fgets(mail, 257, stdin);

		int ln = strlen(mail) - 1;
		if (mail[ln] == '\n')
			mail[ln] = '\x00';
		else ln++;

		if (ln < 1)
			continue;

		for (int i = 0; i < ln; i++)
		{
			if ((mail[i] < '0' || mail[i] > '9') && mail[i] != '.' && mail[i] != '@')
			{
				if (i & 1)
					mail[i] &= 0xDF;
				else
					mail[i] |= 0x20;
			}
		} //change chars case

		GetMD5(mail, ln, mail);

		for (int i = 0; i < 32; i++)
		{
			if (mail[i] < '0' || mail[i] > '9')
			{
				mail[i] &= 0xDF;
				GetMD5(mail, 32, hashes[i]);
				mail[i] |= 0x20;
			}
			else
				GetMD5(mail, 32, hashes[i]);
		}

		for (int i = 0; i < 32; i++)
			mail[i] = hashes[i][i];

		printf("%s\n", mail);	
	}
}


Функция GetMD5 самая стандартная, взятая отсюда. Компилируем, запускаем:

Убрано под спойлер


Solved. На этом прощаюсь.
Теги:
Хабы:
Всего голосов 16: ↑13 и ↓3+10
Комментарии5

Публикации

Ближайшие события