Тема: Solutions
Показать сообщение отдельно

  #5  
Старый 10.01.2007, 13:21
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
С нами: 10721066

Репутация: 4360


По умолчанию

CrackMe: CrackMe by [Great]
Цель: найти верный пароль
Сложность: средне
Решение:
Выложу сам свое решение нормальное
Во-первых прога запакована UPX'ом, поэтому быстро распаковываем.
Открываем прогу в олли, ждем окончания анализа, запускаем по F5, и.... она закрывается. Причем вместе с олли. Аналогичная фишка и в других отладчиках, например, встроенном в MS Visual Studio. Что-то тут не так
Вообще можно обойтись плагином IsDebuggerPresent hide для олли, но ввиду того, что он есть не у всех, мы пойдем влоб)
Код:
004010B5  |.  B8 01000000   MOV EAX, 1
004010BA  |.  40            INC EAX
004010BB  |.  68 8C114000   PUSH ucrackme.0040118C
004010C0  |.  64:8B40 FE    MOV EAX, DWORD PTR FS:[EAX-2]
004010C4  |.  50            PUSH EAX
004010C5  |.  64:8925 00000>MOV DWORD PTR FS:[0], ESP
Это, очевидно, установка SEH, только слегка измененная, чтобы Олли её не опознал, как таковую Дальше идет код, который всегда вызовет исключение нарушения доступа, слегка замаскированный. Поэтому просто ставим бряк на 0040118c и жмем F9(Run). Брякаемся на 40118c. Идет расшифровка строк kernel32.dll и IsDebuggerPresent и запуск этой функции:
Код:
0040120F   .  FF55 FC       CALL DWORD PTR [EBP-4]                   ;  kernel32.IsDebuggerPresent
Конечно же, без плагина, она возвратит 1. Смело ставим в EAX 0 и двигаемся дальше. Нопим call EnumWindows, т.к. она ищет окно Olly и грохает его. Подходим к DialogBoxParamA. DlgProc устроена так, что после нажатия ОК она возвращает указатель на строку и дропает окно. Поэтому вводим что-нибудь и нажимаем ОК. Видим:
Код:
004012DA   .  68 90304000   PUSH ucrackme.00403090                   ;  ASCII "ertwrwe"
004012DF   .  E8 DC010000   CALL ucrackme.004014C0
004012E4   .  83C4 04       ADD ESP, 4
004012E7   .  8BF0          MOV ESI, EAX
004012E9   .  68 64304000   PUSH ucrackme.00403064                   ;  ASCII "rqugvPo`ac[mehgvPrduqsnva"
004012EE   .  E8 CD010000   CALL ucrackme.004014C0
004012F3   .  83C4 04       ADD ESP, 4
004012F6   .  3BF0          CMP ESI, EAX
ertwrwe - это введено в поле. Очевидно, это сравнене длин. Смело нопим, чтобы не мешало или просто ставим курсор на инструкцию JE, Ctrl-*, делаем флаг Z=1. Перескакиваем вывод ругательства из-за неправильной длины. Далее идет цикл проверки:
Код:
00401365   .  0FBE8A 903040>MOVSX ECX, BYTE PTR [EDX+403090]
0040136C   .  8B45 F8       MOV EAX, DWORD PTR [EBP-8]
0040136F   .  33D2          XOR EDX, EDX
00401371   .  BE 0B000000   MOV ESI, 0B
00401376   .  F7F6          DIV ESI
00401378   .  0FBE92 803040>MOVSX EDX, BYTE PTR [EDX+403080]
0040137F   .  33CA          XOR ECX, EDX
00401381   .  0FBEC1        MOVSX EAX, CL
00401384   .  8B4D F8       MOV ECX, DWORD PTR [EBP-8]
00401387   .  0FBE91 643040>MOVSX EDX, BYTE PTR [ECX+403064]
0040138E   .  3BC2          CMP EAX, EDX
Самый обычный XOR циклически с ключем. Расшифровывая быстренько правильный пароль, получим super_mega_lamer_password.
Перезапускаем, вводим super_mega_lamer_password и Registration completed!

Последний раз редактировалось _Great_; 10.01.2007 в 13:24..
 
Ответить с цитированием