Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Реверсинг (https://forum.antichat.xyz/forumdisplay.php?f=94)
-   -   CrackME[6] (https://forum.antichat.xyz/showthread.php?t=29832)

taha 25.12.2006 01:23

CrackME[6]/[7]
 
Выдалось пару часиков, набросал вот кое что))

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

Цитата:

Сообщение от _Great_
Честно признаюсь, не знал про такую фишку антиотладки :)

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

Тоде честно признаюсь, что не знал, если бы он вынес это в отдельную секцию, и не выкидывал бы на ExitProcess, а просто незаметно код подпортил, думаю часика на пол бы в раздумки загнал.
Цитата:

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

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

Та это мне показалось, что он немного подругому сделал :)

_Great_ 28.12.2006 18:08

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

taha 01.01.2007 22:49

CrackMe[7] by Taha
 
Впринципе новый крякмис. Но новою тему создавать постеснялся тк, это сильно модерированный старый.

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

CrackMe[7] или что я хотел увидеть
 
Вообще то я хотел увидеть не сухой ответ типа: "Переход тут". А собственно последовательность действий после которых вы пришли к этому выводу.
Поскольку следующий пост не специально прочитать нельзя, могу смело выложить пример подобающего ответа)) Конечно исходников у вас быть не могло. Но еслиб вы видели номер, как я перегонял свои функции из 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,3Ch,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'

__________________________________________________ __________________________________


Время: 17:34