Всем привет. Сегодня мы рассмотрим крекми creakme_001 от DiS[IP]. Вот, что автор пишет про свой крекми.
Это мой первый CrackMe. Он очень простой, поэтому вы должны взломать его быстро.
В имени укажите латинские символы («A»...«Z», «a»...«z») и цифры («0»... «9»).
Не пишите cпециальные символы!
Написан на ассемблере
Файл конечно не запакован
Сложность: 0/10
Отлично, сложность 0 из 10-ти. Давайте запустим крекми и посмотрим на него. Я буду запускать его под Вин7, но думаю, что и под Вин10, тоже все будет работать.
Вот внешний вид крекми.
То есть нам нужно ввести правильное имя и пароль и нажать кнопку регистрации. Если всё будет нормально, нас поздравят с победой.
Давайте откроем наш дизассемблер IDA PRO и загурзим файл. Я буду использовать версию 6.8, так как она установлена у меня на ПК.
Нам показывается следующее представление
Нажмем на спейсбар и переключимся в стандартный оконный режим.
Сейчас мы находимся на точке входа.
Видим, что у нас есть 4-ре функции для получения дескриптора модуля, инициализации контролов, выхода из процесса, и параметры диалога, и больше ничего. Но еслиь присмотримся то увидим, что есть смещение на фунцию DialogFunc. Двойным щелчком перейдем туда.
Это и есть наша функция.
Если посмотрим влево вверх то увидим, что функций не так уж и много. Всего три. Поэтому мы и используем дизассемблер, а не отладчик.
То есть из этой второй будет вызываться третья.
Все что находится ниже, это импорты.
Сейчас нам нужно найти где считывается логин и пароль. Нажимаем слева на импорте GetDlgItemTextA и попадаем в секцию импорта.
На GetDlgItemTextA нажимаем [X] и видим, что есть две перекрестные ссылки.
Сразу можно догадаться, что это считывается логин и пароль. Перейдем на первую и попадаем сюда.
Здесь я не знаю, что сначала считывается логин или пароль. Поэтому устанавливаю точку останова через [F2] и запускаю программу через [F9].
Нам появляется окошко для ввода пароля. Я ввожу логин Narvaja и пароль 989898
и нажимаю кнопку Register. После этого IDA останавливается на моей точке останова.
Я последовательно выполняю инструкции с помощью [F8] чтобы не заходить в колы до инструкции CMP EAX, 3.
Сейчас если я подведу курсом мышки к байту 403014, то всплывет следующая подсказка
Пока неясно, что это пароль или логин. Поэтому дважды щелкаем на этот бай и попадаем сюда.
Видно, что второй вызов сохраняет логин.
А первый это пароль.
Останавливаем нашу отладку.
Теперь мы можем переименовать нашу переменные, чтобы нам легче было читать код.
Я нажимаю [N] и ввожу здесь новое имя.
Теперь наш код выглядит так.
Не забываем также снять точки останова, они нам больше не нужны.
Ниже и левее идет следующий вызов.
Предупреждающий нас, что нужно использовать минимум 3 символа в имени. А если пойдем направо, то увидим, последний третий вызов в котором и проводится проверка.
Но перед этим нам нужно переименовать эту переменную, скорее всего она будет использовать её внутри функции.
Но как узнать что это?
Если посмотрим выше то EAX сравнивается с 3, а значит это длина строки. А здесь EAX кладется в переменную DWORD_403025. Поэтому переименуем её в LenghtOfName
Давайте теперь перейдем внутрь функции 4010FE.
Вот мы и в нашей функции.
В самом низу нас ждет заветный мессадж бокс.
То есть, чтобы взломать этот креми нам нужно изменить эти три перехода, поменять JNZ на JZ.
Для этого я запущу Олли который также нормально работает в Вин7, в котором проще это будет сделать, загружу туда файл и перейду по следующим адресам.
Меняю инструкции на противоположные.
Нажимаем [F9] и проверяем наши догадки.
Мы победили. Взломали программу. Теперь попробуем написать генератор серийный номеров. Вернемся обратно в ИДУ.
Если нажмем на [F5] увидим, что декомпилятор нам врет, поэтому будем все делать вручную.
Я также буду оставлять комментарии в базе, чтобы поделиться ей с Вами.
Здесь EAX, EBX, ECX присваиваются нули. Переменной по адресу 403039 тоже ноль. Но непонятно, что это за переменная, поэтому нажимаем на ней [Х].
Похоже на счетчик, поэтому переименуем её в Counter.
Идем дальше.
EBX снова присваевается ноль. B BL помещается очередной символ. Он сравнивается с 5A и идет переход. Но что такое 5A ? Нажимаем правую кнопку на этой цифре и появляется следующее меню.
В самом начале нас предупреждали про символы, поэтому выбираем этот вариант.
Теперь у нас так.
То есть если введенный символ не равен Z переходим на зеленую стрелочку, иначе на красную, то есть когда равен. Там происходит уменьшение регистра BL.
Следующие 4-ре блока аналогичные, поэтому просто проставлю комментарии для базы.
Теперь переходим к самому важному блоку.
Если выкинуть ненужные пуш и поп, то получится так.
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]. У нас получится вот так
Итоговый кейген такой
Напоминаю, что этот туториал написал для новичков. Думаю он был полезен и они узнали что-то новое из него. На сим спасибо, до свидания и до следуюшего раза. База иды с комментариями будет приложена как обычно к этому туториалу. Всем пока.
Написано специально для самого уютного форума xss.pro
Автор текста: yashechka
Источник: https://xss.pro/threads/100315/
Файлы
Это мой первый CrackMe. Он очень простой, поэтому вы должны взломать его быстро.
В имени укажите латинские символы («A»...«Z», «a»...«z») и цифры («0»... «9»).
Не пишите cпециальные символы!
Написан на ассемблере
Файл конечно не запакован
Сложность: 0/10
Отлично, сложность 0 из 10-ти. Давайте запустим крекми и посмотрим на него. Я буду запускать его под Вин7, но думаю, что и под Вин10, тоже все будет работать.
Вот внешний вид крекми.
То есть нам нужно ввести правильное имя и пароль и нажать кнопку регистрации. Если всё будет нормально, нас поздравят с победой.
Давайте откроем наш дизассемблер IDA PRO и загурзим файл. Я буду использовать версию 6.8, так как она установлена у меня на ПК.
Нам показывается следующее представление
Нажмем на спейсбар и переключимся в стандартный оконный режим.
Сейчас мы находимся на точке входа.
Видим, что у нас есть 4-ре функции для получения дескриптора модуля, инициализации контролов, выхода из процесса, и параметры диалога, и больше ничего. Но еслиь присмотримся то увидим, что есть смещение на фунцию DialogFunc. Двойным щелчком перейдем туда.
Это и есть наша функция.
Если посмотрим влево вверх то увидим, что функций не так уж и много. Всего три. Поэтому мы и используем дизассемблер, а не отладчик.
То есть из этой второй будет вызываться третья.
Все что находится ниже, это импорты.
Сейчас нам нужно найти где считывается логин и пароль. Нажимаем слева на импорте GetDlgItemTextA и попадаем в секцию импорта.
На GetDlgItemTextA нажимаем [X] и видим, что есть две перекрестные ссылки.
Сразу можно догадаться, что это считывается логин и пароль. Перейдем на первую и попадаем сюда.
Здесь я не знаю, что сначала считывается логин или пароль. Поэтому устанавливаю точку останова через [F2] и запускаю программу через [F9].
Нам появляется окошко для ввода пароля. Я ввожу логин Narvaja и пароль 989898
Я последовательно выполняю инструкции с помощью [F8] чтобы не заходить в колы до инструкции CMP EAX, 3.
Сейчас если я подведу курсом мышки к байту 403014, то всплывет следующая подсказка
Пока неясно, что это пароль или логин. Поэтому дважды щелкаем на этот бай и попадаем сюда.
Видно, что второй вызов сохраняет логин.
А первый это пароль.
Останавливаем нашу отладку.
Теперь мы можем переименовать нашу переменные, чтобы нам легче было читать код.
Я нажимаю [N] и ввожу здесь новое имя.
Теперь наш код выглядит так.
Не забываем также снять точки останова, они нам больше не нужны.
Ниже и левее идет следующий вызов.
Предупреждающий нас, что нужно использовать минимум 3 символа в имени. А если пойдем направо, то увидим, последний третий вызов в котором и проводится проверка.
Но перед этим нам нужно переименовать эту переменную, скорее всего она будет использовать её внутри функции.
Но как узнать что это?
Если посмотрим выше то EAX сравнивается с 3, а значит это длина строки. А здесь EAX кладется в переменную DWORD_403025. Поэтому переименуем её в LenghtOfName
Давайте теперь перейдем внутрь функции 4010FE.
Вот мы и в нашей функции.
В самом низу нас ждет заветный мессадж бокс.
То есть, чтобы взломать этот креми нам нужно изменить эти три перехода, поменять JNZ на JZ.
Для этого я запущу Олли который также нормально работает в Вин7, в котором проще это будет сделать, загружу туда файл и перейду по следующим адресам.
Меняю инструкции на противоположные.
Нажимаем [F9] и проверяем наши догадки.
Мы победили. Взломали программу. Теперь попробуем написать генератор серийный номеров. Вернемся обратно в ИДУ.
Если нажмем на [F5] увидим, что декомпилятор нам врет, поэтому будем все делать вручную.
Я также буду оставлять комментарии в базе, чтобы поделиться ей с Вами.
Здесь EAX, EBX, ECX присваиваются нули. Переменной по адресу 403039 тоже ноль. Но непонятно, что это за переменная, поэтому нажимаем на ней [Х].
Похоже на счетчик, поэтому переименуем её в Counter.
Идем дальше.
EBX снова присваевается ноль. B BL помещается очередной символ. Он сравнивается с 5A и идет переход. Но что такое 5A ? Нажимаем правую кнопку на этой цифре и появляется следующее меню.
В самом начале нас предупреждали про символы, поэтому выбираем этот вариант.
Теперь у нас так.
То есть если введенный символ не равен Z переходим на зеленую стрелочку, иначе на красную, то есть когда равен. Там происходит уменьшение регистра BL.
Следующие 4-ре блока аналогичные, поэтому просто проставлю комментарии для базы.
Теперь переходим к самому важному блоку.
Если выкинуть ненужные пуш и поп, то получится так.
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]. У нас получится вот так
Итоговый кейген такой
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/
Файлы
Вложения
Последнее редактирование: