Спасибо. Вхожу в мир реверса, такие статьи очень помогают.
РАЗБОР
Reverse
Статья
Reverse crackme для начинающих
[ обложка статьи ]
Режим чтения
Прежде чем бросаться ставить IDA Pro через wine, стоит знать: для первых шагов в реверсе совсем не обязательно возиться с виртуалкой и платными дизассемблерами. Ghidra от NSA — бесплатный инструмент с дизассемблером и декомпилятором, которого более чем достаточно для разбора простых crackme, а сам CrackMe, который мы будем ломать ниже, спокойно открывается и в нём. Ещё один полезный ресурс — сайт crackmes.one, где собраны сотни учебных программ разного уровня сложности: от «StupidCrackme» для самых маленьких до серьёзных задач с защитой. Если IDA по каким-то причинам недоступна — это не повод откладывать практику.
Привет всем!
Недавно решился окунуться в это глубокое море реверса, Linux стоит, как основная OS. Первым делом попробовал установить IDA Pro через wine. Успешно, но local debugger не был найден. Спустя некоторое время было понятно одно - нужна винда. На windows переходить не хотелось. Привык уже к linux. Необходимо ставить Windows на Virtual Box. Загрузка Windows 7 lite, установка - ну, вроде живое.
В ближайшем будущем, собираюсь установить FLARE-VM ради более удобной работы.
Так, это план:
Для ассемблера но форуме выделен целый раздел. Расписывать все команды не вижу смысла, поэтому опишу то, что нам пригодятся.
MOV:
Эта команда используется для копирования значения из приёмника в источник.
CMP (CoMPare operands — сравнить операнды):
Для сравнения операндов используется вычитание (это полезно при изучении изучая команды jcc), значения операндов не меняются. Обычно используется для организации условных переходов с командами jmp и jcc (jcc).
JMP (JuMP — прыгнуть, мгновенно перейти):
Продолжить выполнение кода с указанной метки.
JCC (Jump if conditions — перепрыгнуть, перейти если выполняется условие):
Переход к указанной метке выполняется при осуществлении определённого условия. Разновидностей этой команды много: ja,je,jl,jna jz,jpe и т.д. Команда проверяет состояние флагов и если условие выполняется, осуществляет переход к метке. Часто в проверки лицензий, ключей и т.д используется JZ (Jump if Zero. Прыгнуть, если значение 0.) или JNE (Jump if Not Zero. Прыгнуть, если значение не 0.). JZ проверяет значение флага ZF (флаг нуля). Программа выполнила действие, в результате которого получилось 0. Теперь ZF=1. Допустим следующая инструкция:
Программа будет выполняться с того места, которое программист пометил как final.
Push:
Команда push заносит значение в стек, а pop забирает значение из стека. Больше информации.
Основные логические команды двоичной алгебры AND (И), OR (ИЛИ), XOR (ИСКЛЮЧАЮЩЕЕ ИЛИ) и NOT (НЕ). В системе команд процессоров семейства x86 предусмотрены команды AND, OR, XOR, NOT, TEST и ВT, выполняющие перечисленные булевы операции между байтами, словами и двойными словами.
Команды могут влиять на состояние флагов процессора. Эти флажки находятся в регистре флагов. Регистр флагов содержит различные биты, отражающие текущее состояние процессора. После выполнения арифметических и логических команд процессор может поменять или установить новое значение флагов. Например флаги нуля (ZF), переноса (CF), знака (ZF) и др.
Взял из книги про ассемблер список флагов.
После выполнения команды XOR значение заноситься в получателя (X).
Дизассмеблируй, IDA Pro
Ссылка на crackme.
Перед запуском IDA Pro нужно осмотреть пациента.
Обычная программа. Есть функция Registr в меню Help. При неправильной регистрации, видим.
Запускаем IDA. Нажимаем New, затем Portable Executable. Видео про PE файл.
Интерфейс программы, как в космическом корабле : )
Если у вас окно просмотра не как у меня, нажмите пробел и включиться другой режим просмотра.
У нас слишком много данных. Необходимо за что-нибудь зацепиться. Давайте зацепимся за строку "No luck there, mate!", которая возникает при неправильной регистрации. Нажимаем Alt+B. Вводим "No luck there, mate!" и нажимаем OK.
Нас перебросило в место, где инициализируються переменные.
Мы внутри функции sub_401362. Выделяем её и жмём X, тыкаем OK.
Сменим название функции sub_401362 на fail. Выделяем и жмём N. Для удобства, я буду переименовывать некоторые функции. Осмотрев всю карту программы, вернёмся к функции fail. Зелёная и красная стрелочка — это пути по которым программа может выполнить код. Команда JZ помогает в этом выборе.
Для удобства я добавил комментарий Good work. Нажимаем на то место, где хотите поставить комментарий и жмём ;
Зайдём внутрь функции test_1. Чтобы выйти из функции нажмите ESC. Внутри функции test_1 видим следующую картину.
Это проверка на валидность входной строки. Берётся одна из букв строки, которую мы ввели в поле для регистрации. Она помещается в al:
.
Дальше al сравнивается c 41h:
( 41h - это буква A) (цифра 1 на скриншоте). Начиная с 41h и далее идут буквы и иные знаки в таблице кодировки. Для перевода строк из шестнадцатеричного вида в десятичный нажмите H. Ежели число, которые сравнивает программа меньше 41h выводиться "No luck!" (5). Наша буква больше A. Затем она сравнивается с 5Ah (Z) (2). И так далее по этому циклу проверяются последующие буквы (4). По окончанию данного процесса выполняется блок с функцией sub_40139C (7). Внутри этой функции выполняется сложение всех прежде полученных букв. Стоит обратить внимание на:
.
Запоминаем это число и то, что полученное значение заносится в eax:
.
Выходим из функции test_1.
Заходим в функцию test_2.
Видим цикл (1-2-3). Можем предположить, это цикл обработки пароля. В этот цикл также передается значение из функции test_1. Здесь мы видим:
.
Значение заносится в ebx :
.
Выходим из функции test_2. Переименуем эти функции. Теперь мы кое-что поняли.
Выполняется функция login_func, значение заноситься в стек:
(1).
Потом выполняется password_func. Значение логина берётся из стека и переносится в eax:
(2).
Следом выполняется сравнение:
.
Если всё прошло успешно, появляется сообщение "Good work!"
Из всего выше описанного мы поняли алгоритм. Сначала программа складывает коды всех букв, затем делает xor 5678h и в конце ещё раз xor, но уже с 1234h.
Пришло время для keygen'а. Для быстрого написания скриптов Python очень хорошо подходит. Алгоритм не сложный. Соответственно и кода будет чуть-чуть:
из библиотеки sys используется для передачи аргументов командной строки.
- выход из программы
^ - это XOR.
Проверка работjспособности keygen'а:
Предисловие
Привет всем!
Википедия сказал(а):
Недавно решился окунуться в это глубокое море реверса, Linux стоит, как основная OS. Первым делом попробовал установить IDA Pro через wine. Успешно, но local debugger не был найден. Спустя некоторое время было понятно одно - нужна винда. На windows переходить не хотелось. Привык уже к linux. Необходимо ставить Windows на Virtual Box. Загрузка Windows 7 lite, установка - ну, вроде живое.
В ближайшем будущем, собираюсь установить FLARE-VM ради более удобной работы.
Так, это план:
- Ассемблер, ассемблер, ассемблер.
- IDA Pro
- Keygen
Ассемблер, ассемблер, ассемблер
Для ассемблера но форуме выделен целый раздел. Расписывать все команды не вижу смысла, поэтому опишу то, что нам пригодятся.
MOV:
Код:
Mov приемник, источник
CMP (CoMPare operands — сравнить операнды):
Код:
cmp операнд1, операнд2
Для сравнения операндов используется вычитание (это полезно при изучении изучая команды jcc), значения операндов не меняются. Обычно используется для организации условных переходов с командами jmp и jcc (jcc).
JMP (JuMP — прыгнуть, мгновенно перейти):
Код:
jmp метка
Продолжить выполнение кода с указанной метки.
JCC (Jump if conditions — перепрыгнуть, перейти если выполняется условие):
Код:
jcc метка
Код:
JZ final
Push:
Команда push заносит значение в стек, а pop забирает значение из стека. Больше информации.
Логические команды и флаги ассемблера
Основные логические команды двоичной алгебры AND (И), OR (ИЛИ), XOR (ИСКЛЮЧАЮЩЕЕ ИЛИ) и NOT (НЕ). В системе команд процессоров семейства x86 предусмотрены команды AND, OR, XOR, NOT, TEST и ВT, выполняющие перечисленные булевы операции между байтами, словами и двойными словами.
Команды могут влиять на состояние флагов процессора. Эти флажки находятся в регистре флагов. Регистр флагов содержит различные биты, отражающие текущее состояние процессора. После выполнения арифметических и логических команд процессор может поменять или установить новое значение флагов. Например флаги нуля (ZF), переноса (CF), знака (ZF) и др.
Взял из книги про ассемблер список флагов.
В разбираемом crackme используется команда XOR. Разберём подробнее. Например у нас есть 2 пары битов X (получатель) и Y (источник). Их значение может быть 0 или 1. Вот результаты выполнения XOR с разными значениями битов.
После выполнения команды XOR значение заноситься в получателя (X).
Дизассмеблируй, IDA Pro
Ссылка на crackme.
Перед запуском IDA Pro нужно осмотреть пациента.
Обычная программа. Есть функция Registr в меню Help. При неправильной регистрации, видим.
Запускаем IDA. Нажимаем New, затем Portable Executable. Видео про PE файл.
Интерфейс программы, как в космическом корабле : )
Если у вас окно просмотра не как у меня, нажмите пробел и включиться другой режим просмотра.
У нас слишком много данных. Необходимо за что-нибудь зацепиться. Давайте зацепимся за строку "No luck there, mate!", которая возникает при неправильной регистрации. Нажимаем Alt+B. Вводим "No luck there, mate!" и нажимаем OK.
Нас перебросило в место, где инициализируються переменные.
Мы внутри функции sub_401362. Выделяем её и жмём X, тыкаем OK.
Сменим название функции sub_401362 на fail. Выделяем и жмём N. Для удобства, я буду переименовывать некоторые функции. Осмотрев всю карту программы, вернёмся к функции fail. Зелёная и красная стрелочка — это пути по которым программа может выполнить код. Команда JZ помогает в этом выборе.
Для удобства я добавил комментарий Good work. Нажимаем на то место, где хотите поставить комментарий и жмём ;
Зайдём внутрь функции test_1. Чтобы выйти из функции нажмите ESC. Внутри функции test_1 видим следующую картину.
Это проверка на валидность входной строки. Берётся одна из букв строки, которую мы ввели в поле для регистрации. Она помещается в al:
Код:
mov al, [esi]
Дальше al сравнивается c 41h:
Код:
cmp al 41h
Код:
xor edi 5678h
Запоминаем это число и то, что полученное значение заносится в eax:
Код:
mov eax edi
Выходим из функции test_1.
Заходим в функцию test_2.
Видим цикл (1-2-3). Можем предположить, это цикл обработки пароля. В этот цикл также передается значение из функции test_1. Здесь мы видим:
Код:
xor edi 1234h
Значение заносится в ebx :
Код:
mov ebx edi
Выходим из функции test_2. Переименуем эти функции. Теперь мы кое-что поняли.
Выполняется функция login_func, значение заноситься в стек:
Код:
push eax
Потом выполняется password_func. Значение логина берётся из стека и переносится в eax:
Код:
pop eax
Следом выполняется сравнение:
Код:
cmp eax ebx
Если всё прошло успешно, появляется сообщение "Good work!"
Из всего выше описанного мы поняли алгоритм. Сначала программа складывает коды всех букв, затем делает xor 5678h и в конце ещё раз xor, но уже с 1234h.
Keygen
Пришло время для keygen'а. Для быстрого написания скриптов Python очень хорошо подходит. Алгоритм не сложный. Соответственно и кода будет чуть-чуть:
Python:
#!/usr/bin/python3
import sys
def generate_key(name):
word = 0
for letter in name:
word += ord(letter)
return word ^ 0x5678 ^ 0x1234
if __name__ == '__main__':
if len(sys.argv) < 2:
print("Enter a name for registration. (Example: python3 keygen_1.py Alucard)")
sys.exit(1)
else:
print(generate_key(sys.argv[1].upper()))
Код:
sys.argv
Код:
sys.exit(1)
^ - это XOR.
Проверка работjспособности keygen'а:
AI-выжимка
сгенерировано ИИ
Тезисы статьи скоро
Статья читается полностью. Тезисы со ссылками на разделы появятся позже.
Содержание
Codeby Academy
Практика и мастерство
От основ до продвинутого — программы для практиков Codeby.
Перейти к курсу →
Комментарии
23