PDA

Просмотр полной версии : CrackME[6]


taha
25.12.2006, 01:23
Выдалось пару часиков, набросал вот кое что))

http://www.rapidshare.ru/123390

http://slil.ru/23642128

Язык: FASM
Размер: 3kb
Сложность: Для новичков

hidden мне тут сказал, что плагины могут сильно облегчить вам жизнь и скрыть мою задумку.

Очень интерестный способ антиотладки и как я его сразу не заметил

доделал

выдастся ещё часок, сделаю понавороченней =)

hidden
25.12.2006, 06:17
Very well done...
Любимый XOR, кудаже без него :)
На эту ловушку попадётся примерно 98% :D

Очень интерестный способ антиотладки и как я его сразу не заметил

Валидный Пас найден

taha
25.12.2006, 16:30
Ну и где ответы или хотя бы жаркое обсуждение решения. Неужели за, почти, сутки решили только двое!!??

ProTeuS
26.12.2006, 19:20
какие обсуждения - сессия )

а нас4ет антиотладки, хайдн прав, т.к. банальная китайкая сборка все сделает за исследователя и останется только потихоньку исследовать алго шифрования, не имея никаких проблем с отладкой

taha
27.12.2006, 00:59
>>банальная китайкая сборка все сделает за исследователя
поэтому я её часто отключаю)), просто когда это юзаешь теряешь навыки

что мне нравится в этой сборке, так это остановка на t.., на t.., ну вобщем кто исследовал знает, меньше гемороя с PEeditor'ом))

но мы с hidden'ом посовещались и "банальная китайкая сборка" сделает не всё за реверсера)), по крайней мере он должен будет знать что подключить, а что выключить

>> исследовать алго шифрования

>>Любимый XOR, кудаже без него

_Great_
27.12.2006, 17:43
Прикольно ;)
Мне понравилась антиотладка. Респект :)
90% новичков на этом слетят)
Пасс найден. (Валидный Пас ага :D )

Плюсик ща не поставлю, не дают =( Говорят, что слишком много плюсиков сегодня ставил. Гады

Честно признаюсь, не знал про такую фишку антиотладки :)
Правда, когда олька брякнулась на kernel32.ExitProcess, я понял, что что-то не так :)

hidden, а где ты там две ловушки нашел? :) Хотя я просто все лишнее нопил, чтобы не мешалось, поэтому мб и не заметил вторую))

TAHA, кинь потом плз сорсик ) Хочу посмотреть на реализацию первой антиотладочной фишки :)

hidden
27.12.2006, 20:10
Честно признаюсь, не знал про такую фишку антиотладки :)

Правда, когда олька брякнулась на kernel32.ExitProcess, я понял, что что-то не так :)
Тоде честно признаюсь, что не знал, если бы он вынес это в отдельную секцию, и не выкидывал бы на ExitProcess, а просто незаметно код подпортил, думаю часика на пол бы в раздумки загнал.
hidden, а где ты там две ловушки нашел? :) Хотя я просто все лишнее нопил, чтобы не мешалось, поэтому мб и не заметил вторую))

TAHA, кинь потом плз сорсик ) Хочу посмотреть на реализацию первой антиотладочной фишки :)Та это мне показалось, что он немного подругому сделал :)

_Great_
28.12.2006, 18:08
На самом деле я спалил tls callback на этапе просмотра экзешника в иде. Умная ида послушно обзывает все калбеки как TlsCallback, поэтому по названию все стало ясно)

taha
01.01.2007, 22:49
Впринципе новый крякмис. Но новою тему создавать постеснялся тк, это сильно модерированный старый.

http://www.rapidshare.ru/129998
http://slil.ru/23672900

Язык: FASM
Вес: 4 kb
Сложность: средне
Ничем не запакован!

Думаю вам понравится). Особенно антиотладка в функции CryptStr. Попозже могу выложить сорц.

Пас старый, имхо не суть))!!

zl0y
02.01.2007, 01:15
Сломано:
Время:40 секунд
После взлома выдает happy end =)
http://img161.imageshack.us/img161/5180/cracjqj2.jpg

taha
02.01.2007, 17:32
Вообще то я хотел увидеть не сухой ответ типа: "Переход тут". А собственно последовательность действий после которых вы пришли к этому выводу.
Поскольку следующий пост не специально прочитать нельзя, могу смело выложить пример подобающего ответа)) Конечно исходников у вас быть не могло. Но еслиб вы видели номер, как я перегонял свои функции из MASM в FASM =). Я не знаю кгде в фасм лежат некоторые неообходимые структуры тк дело чаще имею с масм. Я просто брал функции компилил на масм, потом рипал необходимые структуры. Конечно далёкий от совершенства способ но... Вобщем я понял, что каждый ассемблер хорош для своих целей))
Ну начнём... Грузим прогу в Olly. Мдя много непонятных функций. F9, прога запустилась. Оля проставила в комментах используемые апи (От меня: Это пережиток воровства функций. Я хотел это сделать и ещё коечего, но потом понял, что мне к премутациям приступать пока рано))!! Но поиск кернел32 и апи решил оставить. ИМХО должно затруднить реверс тем кто юзает дезассемблеры).
Вводим чтонить, enter. Прога немного повисла.. Что это? Спросит читатель! Терпение, - скажу я!! Перезапустим прогу и поставим бряк на USER32.GetDlgItemTextA. Опять что-нибудь вводим! И брякаемся на этой функции. F8, прога считала введёное слово.Трассерим дальше, программа начинает что то расшифровывать и пушить, точнее наоборот)), пушить и расшифровывать.

00401101 > FFB6 2F124000 PUSH DWORD PTR DS:[ESI+40122F]
00401107 . BF 04000000 MOV EDI,4
0040110C > 80343C 25 XOR BYTE PTR SS:[ESP+EDI],25
00401110 . 4F DEC EDI
00401111 .^75 F9 JNZ SHORT CrackMe[.0040110C
00401113 . 83EE 04 SUB ESI,4
00401116 . 83FE FC CMP ESI,-4
00401119 .^75 E6 JNZ SHORT CrackMe[.00401101

От меня: ______________________________________

В исходном варианте это выглядело так:


@@: push dword [CMPProc+esi]
mov edi,4h
@@2: xor byte [esp+edi],25h
dec edi
jne @@2
sub esi,4h
cmp esi,-4h
jne @B
_______________________________________________

Дальше в edi идёт адрес введённого слова.

mov edi,caption

А в стек адрес после джампа. Этот прыжок должен был показаться вам странным, так как он идёт сам на себя.

0040112A >-EB FE JMP SHORT CrackMe[.0040112A

Вот почему программа подвисала. Тогда как автор(тобишь я) проверяю пасс? По идее после:

mov esi,esp
add esi,4h

Должен идти прыжок на esi. Так как вышеперечислиные действия должны были напомнить вам элементы стекового полиморфизма)).
Но почему там jmp $. Вот тут вы должны были вспомнить мой предыдущий крякмис. Там была применина такая вещь, как tls.callback. Способы обхода этой функции я описывал в своей статье "Общие концепции борьбы с протектерами". Я предпочитаю пользоваться плагином Olly Advanced. Где его скачать я постил в треде посвящённом тулзам. Так вот в опциях к плагину ставим "Break on TLS Callback". Перезапускаем программу. Мы попали в колбечную функцию.

00401257 /. 55 PUSH EBP
00401258 |. 89E5 MOV EBP,ESP
0040125A |. 837D 0C 01 CMP DWORD PTR SS:[EBP+C],1
0040125E |. 75 0E JNZ SHORT CrackMe[.0040126E
00401260 |. FF15 5C304000 CALL DWORD PTR DS:[<&KERNEL32.IsDebugger>; [IsDebuggerPresent
00401266 |. 85C0 TEST EAX,EAX
00401268 |. 74 04 JE SHORT CrackMe[.0040126E
0040126A |> C9 LEAVE
0040126B |. C2 0C00 RETN 0C
0040126E |> 803D 00104000 >CMP BYTE PTR DS:[<ModuleEntryPoint>],0CC
00401275 |.^74 F3 JE SHORT CrackMe[.0040126A
00401277 |. 66:C705 2A1140>MOV WORD PTR DS:[40112A],0E6FF
00401280 |. C9 LEAVE
00401281 \. C2 0C00 RETN 0C

Если дебугер включен или/и на ep стоит int3; ничего не происходит. А если нет jmp $ меняется на jmp esi))). Обходим всё это и добираемся до нашего jmp. Он изменился, как мы и предполагали, на jmp esi. Переходим по нему.

0006FCA8 33F6 XOR ESI,ESI
0006FCAA 4E DEC ESI
0006FCAB 8B0D 71214000 MOV ECX,DWORD PTR DS:[402171]
0006FCB1 83E9 02 SUB ECX,2
0006FCB4 46 INC ESI
0006FCB5 49 DEC ECX
0006FCB6 8A86 67214000 MOV AL,BYTE PTR DS:[ESI+402167]
0006FCBC 66:31F0 XOR AX,SI
0006FCBF 3A0437 CMP AL,BYTE PTR DS:[EDI+ESI]
0006FCC2 75 09 JNZ SHORT 0006FCCD
0006FCC4 85C9 TEST ECX,ECX
0006FCC6 ^75 EC JNZ SHORT 0006FCB4
0006FCC8 31C0 XOR EAX,EAX
0006FCCA 40 INC EAX
0006FCCB EB 02 JMP SHORT 0006FCCF
0006FCCD 31C0 XOR EAX,EAX
0006FCCF C3 RETN

Функция сравнения пароля. Кста в оригинале она выглядит почти также =))). Идём до ret'а. и выходим на

0040112C . 83C4 28 ADD ESP,28

Вот зачем перед этим шло push CrackMe[.0040112C. Знаменитый push + ret)). Add же чистит стек от функции проверки.
А дальше идёт та самая проверка на валидность пасса:

00401131 . 85C0 TEST EAX,EAX
00401133 . 74 44 JE SHORT CrackMe[.00401179

Перебиваем je на jne. И f9. Брякаемся на исключении:

004011C9 > 31C0 XOR EAX,EAX
004011CB . C700 01000000 MOV DWORD PTR DS:[EAX],1

Жмём шифт-f9 пока не вылитит нужная мессага. Happy end.

Кому интересна функция CryptStr.
Смотрим в окне стека адрес SEH-функции. И ставим на неё бряк. Шифт-f9. И мы в функции.

004011F0 |. FF05 97214000 INC DWORD PTR DS:[402197] ; CrackMe[.0040218A
004011F6 |. 8B1D 97214000 MOV EBX,DWORD PTR DS:[402197] ; CrackMe[.0040218A
004011FC |. 8A0B MOV CL,BYTE PTR DS:[EBX]
004011FE |. 84C9 TEST CL,CL
00401200 |. 74 09 JE SHORT CrackMe[.0040120B

Украденный код проверки на конец строки. Если строка не закончилась, то к eip исключительной ситуации добавляем 6(размер mov dword ptr [eax],1). Выходим к расшифровке байта. А если строка закончилась, переходим на восстановлние регистров в функции CryptStr. Вот такой вот замысловатый SEH =)).

Сорц пробной программы: __________________________________________________ __________
format PE GUI 4.0
include 'include\win32a.inc'
entry $
start:
push 15h
push szmsgBody
call Crypt

invoke MessageBox,0,szmsgBody,szmsgBody,0

invoke ExitProcess,0

proc Crypt kstr:dword,kk:byte
push edi
push eax
mov edi,[ebp+8]
mov [cstr],edi
mov ah,byte [ebp+0Ch]
mov byte [key],ah

push ebp ; \ Устанавливаем SEH
push esp ; |
push Next ; |
push SEHHandler ; |
push dword [fs:0] ; |
mov [fs:0],ESP ; /

dec dword [cstr]
@@:
xor eax,eax ;\ Исключение
mov dword [eax],1 ;/

sub esp,10h ;<--- Всстанавливем seh, тк он удаляется после выполнения SEHHandler

mov al, byte [key]
mov ebx,dword [cstr]
xor byte [ebx],al
jmp @B
Next:
pop eax
pop edi
ret
endp

proc SEHHandler
PUSH EDX
MOV EDX,DWORD [EBP+0Ch]
MOV EAX,DWORD [EBP+10h]

inc dword [cstr] ; \ Украденные байты))
mov ebx,dword [cstr] ; |
mov cl,byte [ebx] ; |
test cl,cl ; | Если 0, то возврат на Next(SafeOffset)
je @F ; /

add dword [EAX+0B8h],6h ; Если нет, то на eip+6 (это размер mov dword [eax],1)
jmp ne0 ; Для продолжения расшифровки!
@@:
PUSH DWORD [EDX+8h] ;[edx].SafeOffset
POP DWORD [EAX+0B8h] ;[eax].regEip
ne0:
PUSH DWORD [EDX+0Ch] ;[edx].PrevEsp
POP DWORD [EAX+0C4h] ;[eax].regEsp
PUSH DWORD [EDX+10h] ;[edx].PrevEbp
POP DWORD [EAX+0B4h] ;[eax].regEbp

MOV EAX,0h
POP EDX
ret
endp

section '.data' data readable writeable
key dd ?
cstr dd ?
szmsgBody db 5Dh,74h,65h,65h,6Ch,35h,70h,7Bh,71h,34h,35h,28h,3C h,00h ; "Happy end! =)", 0

section '.idata' import data readable writeable
library kernel,'KERNEL32.DLL',\
user,'USER32.DLL'
import kernel,\
ExitProcess,'ExitProcess'
import user,\
MessageBox,'MessageBoxA'
__________________________________________________ __________________________________