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

CrackMe Creakme_001 DiS[IP] (writeup)

yashechka

Генератор контента.Фанат Ильфака и Рикардо Нарвахи
Эксперт
Регистрация
24.11.2012
Сообщения
2 344
Реакции
3 563
Всем привет. Сегодня мы рассмотрим крекми creakme_001 от DiS[IP]. Вот, что автор пишет про свой крекми.

Это мой первый CrackMe. Он очень простой, поэтому вы должны взломать его быстро.

В имени укажите латинские символы («A»...«Z», «a»...«z») и цифры («0»... «9»).

Не пишите cпециальные символы!

Написан на ассемблере

Файл конечно не запакован :)

Сложность: 0/10 :)


Отлично, сложность 0 из 10-ти. Давайте запустим крекми и посмотрим на него. Я буду запускать его под Вин7, но думаю, что и под Вин10, тоже все будет работать.

Вот внешний вид крекми.

1697572504166.png


То есть нам нужно ввести правильное имя и пароль и нажать кнопку регистрации. Если всё будет нормально, нас поздравят с победой.

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

1697572516815.png


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

1697572531504.png


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

1697572539833.png


Сейчас мы находимся на точке входа.

1697572548293.png


Видим, что у нас есть 4-ре функции для получения дескриптора модуля, инициализации контролов, выхода из процесса, и параметры диалога, и больше ничего. Но еслиь присмотримся то увидим, что есть смещение на фунцию DialogFunc. Двойным щелчком перейдем туда.

1697572562263.png


Это и есть наша функция.

Если посмотрим влево вверх то увидим, что функций не так уж и много. Всего три. Поэтому мы и используем дизассемблер, а не отладчик.

То есть из этой второй будет вызываться третья.

1697572576108.png


Все что находится ниже, это импорты.

Сейчас нам нужно найти где считывается логин и пароль. Нажимаем слева на импорте GetDlgItemTextA и попадаем в секцию импорта.

1697572585768.png


1697572590429.png


На GetDlgItemTextA нажимаем [X] и видим, что есть две перекрестные ссылки.

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

1697572600086.png


Здесь я не знаю, что сначала считывается логин или пароль. Поэтому устанавливаю точку останова через [F2] и запускаю программу через [F9].

Нам появляется окошко для ввода пароля. Я ввожу логин Narvaja и пароль 989898 :D и нажимаю кнопку Register. После этого IDA останавливается на моей точке останова.

1697572609881.png


Я последовательно выполняю инструкции с помощью [F8] чтобы не заходить в колы до инструкции CMP EAX, 3.

Сейчас если я подведу курсом мышки к байту 403014, то всплывет следующая подсказка

1697572619787.png


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

1697572628803.png


Видно, что второй вызов сохраняет логин.

А первый это пароль.

1697572642079.png


Останавливаем нашу отладку.

1697572652000.png


Теперь мы можем переименовать нашу переменные, чтобы нам легче было читать код.

Я нажимаю [N] и ввожу здесь новое имя.

1697572660278.png


Теперь наш код выглядит так.

1697572672477.png


Не забываем также снять точки останова, они нам больше не нужны.

Ниже и левее идет следующий вызов.

1697572695153.png


Предупреждающий нас, что нужно использовать минимум 3 символа в имени. А если пойдем направо, то увидим, последний третий вызов в котором и проводится проверка.

1697572703578.png

Но перед этим нам нужно переименовать эту переменную, скорее всего она будет использовать её внутри функции.

1697572711760.png


Но как узнать что это?

Если посмотрим выше то EAX сравнивается с 3, а значит это длина строки. А здесь EAX кладется в переменную DWORD_403025. Поэтому переименуем её в LenghtOfName

1697572722158.png


Давайте теперь перейдем внутрь функции 4010FE.

Вот мы и в нашей функции.

1697572734510.png


В самом низу нас ждет заветный мессадж бокс.

1697572742726.png


То есть, чтобы взломать этот креми нам нужно изменить эти три перехода, поменять JNZ на JZ.

1697572751043.png



Для этого я запущу Олли который также нормально работает в Вин7, в котором проще это будет сделать, загружу туда файл и перейду по следующим адресам.

1697572764187.png


1697572769837.png


Меняю инструкции на противоположные.

1697572778163.png


Нажимаем [F9] и проверяем наши догадки.

1697572785952.png

Мы победили. Взломали программу. Теперь попробуем написать генератор серийный номеров. Вернемся обратно в ИДУ.

Если нажмем на [F5] увидим, что декомпилятор нам врет, поэтому будем все делать вручную.

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

1697572798141.png


Здесь EAX, EBX, ECX присваиваются нули. Переменной по адресу 403039 тоже ноль. Но непонятно, что это за переменная, поэтому нажимаем на ней [Х].

1697572807528.png


Похоже на счетчик, поэтому переименуем её в Counter.

1697572817819.png


Идем дальше.

1697572828137.png


EBX снова присваевается ноль. B BL помещается очередной символ. Он сравнивается с 5A и идет переход. Но что такое 5A ? Нажимаем правую кнопку на этой цифре и появляется следующее меню.

1697572840687.png


В самом начале нас предупреждали про символы, поэтому выбираем этот вариант.

Теперь у нас так.
1697572850936.png


То есть если введенный символ не равен Z переходим на зеленую стрелочку, иначе на красную, то есть когда равен. Там происходит уменьшение регистра BL.

1697572866226.png


Следующие 4-ре блока аналогичные, поэтому просто проставлю комментарии для базы.

1697572871979.png


Теперь переходим к самому важному блоку.

1697572880679.png


Если выкинуть ненужные пуш и поп, то получится так.

add eax, 61h ; EAX = EAX + 61

add bh, al ; BH = BH + AL

add bl, 1 ; BL++

mov cx, PASS[eax*2] ; CX = PASS[I*2]


Напомню, что наш текущий символ хранится к регистре BL. А это младшая часть регистра BX. Т.е. регистр BX = BHBL. Сразу в глаза бросается, что мы работаем с одним байтом, а потом идет сравнение с вордом(двумя байтами) в регистре CX, то есит. на каждый введенный символ в имени, в пароле их будет два.

Также мы можем посмотреть алгоритм нажав на кнопку [F12]. У нас получится вот так

1697572900431.png


Итоговый кейген такой

Python:
name = str(raw_input("Give me your name"))


key = ''


for i, char in enumerate(name):


bl = ord(char)


if bl in [ord('Z'), ord('z'), ord('9')]:


bl = bl - 1



key = key + chr(bl + 1)


key = key + chr(ord('a') + i)


print(key)

Напоминаю, что этот туториал написал для новичков. Думаю он был полезен и они узнали что-то новое из него. На сим спасибо, до свидания и до следуюшего раза. База иды с комментариями будет приложена как обычно к этому туториалу. Всем пока.

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


Файлы
 

Вложения

  • Creakme.zip
    21.3 КБ · Просмотры: 6
Последнее редактирование:


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