• XSS.stack #1 – первый литературный журнал от юзеров форума

CrackMe Crackme Splish от +cuPegasus[REN] и Crudd. (writeup)

yashechka

Генератор контента.Фанат Ильфака и Рикардо Нарвахи
Эксперт
Регистрация
24.11.2012
Сообщения
2 344
Реакции
3 563
Всем привет. В этот туториале будем рассматривать крекми 3 в одном под названием Splish от +cuPegasus[REN] и Crudd. Первую версию этого крекми уже разбирал Рикардо Нарваха в своем курсе — Введение в крекинг с нуля, почитать про который можно например тут — https://wasm.in/blogs/vvedenie-v-krehking-s-nulja-ispolzuja-ollydbg-glava-15.481/ .

Давайте запустим наш крекми и посмотрим на его внешний вид, чтобы понять почему он называется 3 в одном.

Нам показывается следующее окно.

1698055904202.png


И ничего дальше не грузится. Не работает ни правая, ни левая кнопка мыши. Но если посмотрим на панель задач, увидим следующую подсказку.

1698055917732.png


Крекми просит сделать на нем двойной щелчок. Давайте так и сделаем.

Нам загружается диалоговое окно и мы видим, что перед нами два задания. Но где же третье?

Для этого нажмем на кнопку О программе и прочитаем послание от создателя.

1698055929568.png



1698055952685.png


1. Удалите НАГ (диалог появившийся в начале)

2. Найдите вшитый серийник

3. Найдите комбинацию имя и серийника для своего имени

4. Напишите кейген на асме или на чистом С++ (не консольное приложение ------ че эт вдруг :D)

5. Напишите детальный туториал для задач 1-4

Давайте начнем с первого пункта, что логично. Загрузим наш файл в IDA PRO. Я буду использовать версию 6.8, так как она установлена у меня на ПК. Будем отталкиваться от того что нужно сделать двойной клик на наге.

1698055959573.png


Нам загружается следующее представление, которое мне не очень удобно.

1698055966333.png


Давайте переключимся в классический вид нажав спейсбар.

1698055971924.png


Видим, что у нас очень много Апи функций, а родных всего шесть.

1698055978381.png


Сейчас нам нужно найти обработчик двойного нажатия мыши. Но какой у него код? Это можно посмотреть в Олли. Я загружаю файл, нажимаю [F9], нажимаю кнопку W

1698055987958.png


и нам показывается окно, но пустое.


Такое бывает. Чтобы элементы появились в окне нажимаем П.К.М и выбираем Actualize.

Теперь наше окно заполнено.

1698056001743.png


После этого нажмем на любом элементе П.К.М, появится следующее меню.

1698056009019.png


Нужный нам пункт называется Message breakpoint on ClassProc. Его и выбираем.

1698056019597.png


Нам появляется окошко. Видим, что есть пункт Messages с выпадающим списком. Давайте будем искать там наш двойной щелчок.

1698056031058.png


Ага. То есть его код равен 203 в хексе.

Теперь возвращаемся в нашу Иду, и идем в SearchText…

1698056038613.png


Будем искать строку 203, что логично.

Когда поиск завершен, мы попадаем сюда.

1698056054629.png


Поднимемся в начало функции.

1698056063903.png


Выберем текст sub_401263. Сейчас мы будем искать обратный вызов. Для этого нажимаем [X].

1698056076208.png


Переходим по этому адресу и попадаем сюда.

1698056082747.png

Переименуем этот вызов в WndProc через клавишу [N]. У меня получилось вот так.

1698056089017.png


Теперь станем на вызов sub_40117A и как ранее через [Х] найдем обратный вызов.

1698056096041.png


Мы попадаем на функцию START. Для себе я переименую этот вызов sub_40117А в NAG.

У меня получилось вот так.

1698056103250.png


Но наше задание — избавиться от нага. Для этого перейдем в олли.

1698056112201.png


Давайте просто занопаем помеченные строки. На первом PUSH 0A я нажимаю пробел.

1698056118130.png


Ввожу NOP, а потом Assemble, пока не затрутся 4 пуша и 1 кол.

У меня получается вот так.

1698056131615.png


Теперь пробуем запустить нашу программу через [F9].

1698056141145.png


Сразу загружается главное окно без нага, то есть первую часть мы победили. Переходим ко второй, поиску защитого номера. Для этого нажимаем кнопку Check the hardcoded serial, но ничего не происходит. Странно. Давайте попробуем что-нибудь ввести, например единицу. У нас появляется следующее окно

1698056150935.png


Будем также отталкиваться от этой строки. Если она не зашифрована мы её найдем.

В Иде переходим в ViewOpen subviewesStrings и поищем нужные строку.

1698056164173.png


Да, она здесь есть. Делаем Л.К.М. на ней и попадаем сюда.

1698056187471.png


Здесь нажимаем [Х] и по перекрестной строке попадаем в следующую функцию

1698056196544.png


1698056202411.png


Сразу видно, что это BadBoy, а рядом правее находится GoodBoy. Я их перекрашу в соответствующие цвета светофора.

У меня получилось вот так.

1698056213621.png


Чтобы узнать как мы пришли к этому вызову нажимаем на соответствующую стрелочку.

1698056226757.png


Попадаем сюда. Здесь видно, что сравниваются символы друг с другом.

1698056233912.png


Чуть выше и правее у нас такой код.

1698056244492.png


Проверка текущего символа на ноль.

Перейдем ещё правее и увидим следующий код.

1698056252730.png


Неужели, это и есть захардкоженная строка? Сейчас проверим. Вставляем её в наш крекми и нажимаем кнопку проверки.

1698056260623.png

Нас поздравляют с успехом. Мы прошли вторую часть крекми.

1698056268766.png


Переходим к третьей части, которая здесь самая сложная. Также как и во втором случае с захардкоженным номером вводим Name, Serial и нажимаем Check. Нам появляется следующее окно.

1698056278252.png


Нам говорят, что введенная комбинация полный гуан. Будем также отталкиваться от этой строки. Снова идем в наши строки. Переходим в ViewOpen subviewesStrings и поищем нужную строку.

1698056315846.png

Делаем левый щелчок мышью и попадаем сюда.

1698056324069.png


А затем смотрим, где эта строка используется через [Х].

1698056336735.png

Попадаем сюда.

1698056345048.png


Видно, что это BadBoy, а рядом находится GoodBoy. Я их раскрашу в соответствующие цвета.

Весь алгоритм теперь выглядит так.

1698056358766.png


Давайте теперь пойдем от плохого блока вверх. Если последовательно будем поднимать по блокам выше придем в следующий блок.

1698056367283.png

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

1698056376887.png



Но так не понятно имя это или сериал, поэтому перейдем в этот байт.

1698056389105.png


И соберем его через клавишу [А].

1698056395424.png


То есть первый вызов это имя. Теперь переименуем соответствующие переменные. У меня получилось вот так.

1698056401714.png


Теперь будем идти вниз по алгоритму делая соответствующие комментарии.

1698056410249.png


Размер строки сравнивается с нулем, и если размер строки равен нулю, то идем на выход.

1698056553863.png


Сохраняются все регистры в стек, ЕАХ и EBX присваивается ноль. В ESI кладется адрес имени. В ECX помещается длина имени. То есть тут у нас идет инициализация.

1698056588905.png


Далее в AL помещается рассчитанное выражение — количество символов в имени - 1 + текущий символ.

Следующий код такой.

1698056597689.png


Увеличивается на 1 EBX, он у нас в начале равен нулю. Происходит операция XOR между EAX и EBX и идет сравнение с символом D. Если меньше то повторяем цикл.

Далее код такой.

1698056615114.png

Символ сравнивается с M и если он больше то идем на начало цикла. Иначе выходим.

1698056623710.png

Далее следующий блок.

1698056633079.png

Я покрасил весь алгоритм в розовый, поэтому весь алгоритм получился вот таким.

1698056642325.png

Желтым выделен алгоритм проверки захардкоженного номера. Но вернемся к нашему боку

Текущий символ помещается в количество символов в имени - 1 + текущий символ.

Из него вычитается значение 20. Уменьшается на 1 значение ECX и сравнивается с нулем. Если ECX выше то цикл повторяется, то есть Наше имя перебирается от большего к меньшему.

То есть весь наш код можно заменить на следующий на си.

C:
    for(int i = len; i > 0; i--)
    {
            code = username[i-1];
          
            do
            {
               b++;
               code = code ^ b;
            } while(code < 'D' || code > 'M'); 
          
            code = code - 20;
            key[i-1] = code;
    }
  
    cout << key;
}

Далее попадаем сюда.

1698056707105.png


1698056711098.png


1698056716159.png


1698056720434.png


Здесь у нас очередной цикл, в нем идет сравнивание значения из поля Name с полем Serial. То есть правильный сериал все это время хранился в поле Name. Чтобы его увидеть, давайте поставим бряк на бэдбой.

1698056736372.png


Запускам программу и водим следующие данные.

1698056743357.png


Теперь смотрим что у нас в поле Name.

1698056752176.png


Соберем это значение через [A] .

1698056762131.png


То есть для имени 1234567890 серийник равен 1230646180. Давайте проверим нашу догадку.

1698056769544.png


Мы победили третий этап и очередной крекми.


Написано специально для самого уютного форума xss.pro
Автор текста: yashechka
Источник:
https://xss.pro/threads/100697/

СплишСплэш
 

Вложения

  • SplishSplash.zip
    27.6 КБ · Просмотры: 12
Если разрешат, то будут.
 
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх