Решаем crackme часть 1

Я начал свое исследование с простого crackme написанного [Cruehead / MiB] скачать его можно по ссылке: https://github.com/sebastiendamaye/public/tree/master/crackme

md5:     66f573036f8b99863d75743eff84f15d
sha1:     5470e76fffe91a100bf83f6a6bca0737918400cf
sha256: 0c7cdfdb6d4c8876e9c5bae906fcf1cbf174f019ef45d518954885856501a0be


Запускаем:

Вводим произвольные данные:


Ошибка, как мы и ожидали
































Посмотрим, не упаковал ли файл,  ничем не упакован, написан на ASM:





Сразу перейдем к строковым значениям, тут уже интересно, переходим в функцию где использоваться  Good work:



Весь основной функционал происходит тут:



Вызываются две функции, и затем сравнение двух регистров:

0040122D                 call    sub_40137E <- Проверка Name
00401238                   call    sub_4013D8 <- Проверка Serial

cmp eax, ebx <- вероятнее всего тут происходит сравнение данных, данные должны быть одинаковые, чтобы вызвать call ShowGood *




Посмотрим, что происходит с Name:

Здесь проверяется входит ли символ в диапазон  A..Z





и в случае если символ меньше  числа символа "Z"  переводит его в UpperCase:

004013D2 sub     al, 20h  <- Отнимая от числа 32(DEC)  ---Вот таким образом




Почему это делается, для того чтобы легче это понять нужно посмотреть на таблицу ASCII символов, и сразу станет понятно, что символы Uppercase номером меньше чем lowercase, поэтому и отнимается значение:






Затем все значения суммируются и ксорятся (XOR) с значением: 22136(DEC)

004013A2                 xor     edi, 5678h  <- Вот таким образом

Далее смотрим код проверки Serial:




Значения переводятся в числа:

CODE:004013EA           sub, bl, 30h  <- char to byte


Затем ксорятся(XOR) c значением 1234h

На Python примерный код такой:

sum = 0
for x in _name:
    sum = sum + int(ord(x))
sum = sum ^ 22136  #5678h


t = 0
for x in _serial:
    t = t * 10
    t  =  t + (ord(x) - 48)
t = t ^ 4660  #1234h



Затем данные сравниваются из двух регистров:

CODE:00401241             cmp eax, ebx  <---в eax значения name в ebx serial

Если данные совпадают, то отображается окно с текстом о правильном Serial

Решение:

Для этого creackme подойдет операция ксорирование (XOR) значения name c значением из serial так как два XOR одного и тоже значения возвратят его исходное значения в алгоритме, пример на python:


def keygen(name):
    s = 0
    for x in name:
        s = s + ord(x)
    return s ^ 22136 ^ 4660  #5678h Name && 1234h Serial






Вот такое окно:




Комментарии

  1. Красава! Всё доступно и понятно! Python - ruleZ!!!

    ОтветитьУдалить

Отправить комментарий