Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Всем привет. Сегодня у нас опять crackme в виде виртуальной машины, она намного проще прошлой, на ней можно потренироваться, понять основы. Программа написана на ассемблере, кому интересно можете скачать ее в самом конце статьи.
1) Сперва нам нужно определиться какая функция(опкод) что делает. Для этого мы начинаем отлаживание нашей программы. Мы видим такую картину:
Нашу виртуальную машину мы уже нашли, осталось только проанализировать ее. К этому мы и перейдем, но сначала у нас идет инициализация виртуальной машины.
Далее мы видим функцию, где и будет осуществляться все действия в программе. Переходим в нее и видим такое:
Я уже подписал все, т.к я ее уже проанализировал. Если кто не знает, ALT+ ; - переименование функции, переменной, ; - комментарий к строке. В eax(al) помещается наш опкод,а в edx(dl) - параметр
Первый опкод это 0x30, посмотрим что он делает.
(Не обращайте внимание на то, как я обозвал регистры, они могут называться как угодно, в любой последовательности, то есть моя последовательность не есть верной)
Как мы видим, каждый параметр делает что-то свое, в данном случае от параметра зависит какой регистр мы будем "трогать" ,то есть записывать в него что-то или читать из него.
Например, проанализировав ,мы можем понять, что параметры меньше чем 8 выполняют перемещение из регистра виртуальной машины, в наш регистр, то есть отладчика.
В данном случае,мой параметр 9, он означает что из стека(см. ebx) будет прочитано значение и записано в регистр виртуальной машины.
После того, как мы дойдем до ret в этой функции нас перекинет на функцию, которая увеличивает EIP нашего виртуального монстра).
Далее мы попадаем на наше уже знакомое меню, где будет решено какой опкод будет следующий. В моем случае, это 0xB0(см. EAX(AL)) с параметром 0x00(см. EDX(DL))
Заходим внутрь функции.
Видим,что из 2 регистра(в зависимости от параметра), читается значение и записывается к нам в отладчик в регистр EAX.
Ладно, перейдем к основному, к нахождению пароля. Если вам интересно, вот вам краткое описание каждой функции(опкода)
"end of the function" это тот момент, когда мы вводим неверный пароль и нас перекидывает туда.
Если ни один опкод не подошел, значит это получение пароля, но получаем мы его не целиком, а по символу, и записывая это все в регистр 1(виртуальной машины).
Далее,мы получаем наше значение из регистра виртуальной машины, в регистр нашего отладчика.
Также, мы имеем функцию под опкодом 0x20, которая меняет наш EIP(виртуальной машины)
Далее мы попадаем на опкод 0x60,посмотрим что делает он.
Мы получаем значение из регистра под номером 4(вы его можете назвать как угодно)
У нас идет складывание двух чисел ,буфера(reg_7) и нашего пароля(reg_1)
И так по кругу, не буду затягивать, т.к описывать весь процесс можно часами, что займет кучу времени вашего и моего, и места на форуме).
В конечном итоге мы получаем опкод 0x00 с параметром 0x03 и это главная функция, здесь будет сравнение путем xor нашего пароля с константой(0x29A, она находится в 1 виртуальном регистре)
Вот и проверка суммы символов нашего пароля(виртуальный регистр reg_4) и константы(0x29A, хранящаяся в reg_1). Если значения совпадают, то результатом xor будет 0 ,иначе нет. Это все дело сохранится в reg_1.
После этого ,идет опкод 0xD0 для проверки результата xor. Получаем результат xor из reg_1 ,в моем случае это неравно 0 ,т.к я ввел неверный набор символов
Сравнение результата xor с 0.
Наш итоговый пароль: kpyqli(он может быть другим, т.к я использовал брутфорс). Советую скачать и разобрать самому, так станет намного понятнее что и как делать, а это можно сказать будет вам как подсказка.
1) Сперва нам нужно определиться какая функция(опкод) что делает. Для этого мы начинаем отлаживание нашей программы. Мы видим такую картину:
Нашу виртуальную машину мы уже нашли, осталось только проанализировать ее. К этому мы и перейдем, но сначала у нас идет инициализация виртуальной машины.
Далее мы видим функцию, где и будет осуществляться все действия в программе. Переходим в нее и видим такое:
Я уже подписал все, т.к я ее уже проанализировал. Если кто не знает, ALT+ ; - переименование функции, переменной, ; - комментарий к строке. В eax(al) помещается наш опкод,а в edx(dl) - параметр
Первый опкод это 0x30, посмотрим что он делает.
(Не обращайте внимание на то, как я обозвал регистры, они могут называться как угодно, в любой последовательности, то есть моя последовательность не есть верной)
Как мы видим, каждый параметр делает что-то свое, в данном случае от параметра зависит какой регистр мы будем "трогать" ,то есть записывать в него что-то или читать из него.
Например, проанализировав ,мы можем понять, что параметры меньше чем 8 выполняют перемещение из регистра виртуальной машины, в наш регистр, то есть отладчика.
В данном случае,мой параметр 9, он означает что из стека(см. ebx) будет прочитано значение и записано в регистр виртуальной машины.
После того, как мы дойдем до ret в этой функции нас перекинет на функцию, которая увеличивает EIP нашего виртуального монстра).
Далее мы попадаем на наше уже знакомое меню, где будет решено какой опкод будет следующий. В моем случае, это 0xB0(см. EAX(AL)) с параметром 0x00(см. EDX(DL))
Заходим внутрь функции.
Видим,что из 2 регистра(в зависимости от параметра), читается значение и записывается к нам в отладчик в регистр EAX.
Ладно, перейдем к основному, к нахождению пароля. Если вам интересно, вот вам краткое описание каждой функции(опкода)
"end of the function" это тот момент, когда мы вводим неверный пароль и нас перекидывает туда.
Если ни один опкод не подошел, значит это получение пароля, но получаем мы его не целиком, а по символу, и записывая это все в регистр 1(виртуальной машины).
Далее,мы получаем наше значение из регистра виртуальной машины, в регистр нашего отладчика.
Также, мы имеем функцию под опкодом 0x20, которая меняет наш EIP(виртуальной машины)
Далее мы попадаем на опкод 0x60,посмотрим что делает он.
Мы получаем значение из регистра под номером 4(вы его можете назвать как угодно)
У нас идет складывание двух чисел ,буфера(reg_7) и нашего пароля(reg_1)
И так по кругу, не буду затягивать, т.к описывать весь процесс можно часами, что займет кучу времени вашего и моего, и места на форуме).
В конечном итоге мы получаем опкод 0x00 с параметром 0x03 и это главная функция, здесь будет сравнение путем xor нашего пароля с константой(0x29A, она находится в 1 виртуальном регистре)
Вот и проверка суммы символов нашего пароля(виртуальный регистр reg_4) и константы(0x29A, хранящаяся в reg_1). Если значения совпадают, то результатом xor будет 0 ,иначе нет. Это все дело сохранится в reg_1.
После этого ,идет опкод 0xD0 для проверки результата xor. Получаем результат xor из reg_1 ,в моем случае это неравно 0 ,т.к я ввел неверный набор символов
Сравнение результата xor с 0.
Наш итоговый пароль: kpyqli(он может быть другим, т.к я использовал брутфорс). Советую скачать и разобрать самому, так станет намного понятнее что и как делать, а это можно сказать будет вам как подсказка.