CrackME[6]

Discussion in 'Реверсинг' started by taha, 25 Dec 2006.

  1. taha

    taha Elder - Старейшина

    Joined:
    20 Aug 2006
    Messages:
    399
    Likes Received:
    330
    Reputations:
    251
    CrackME[6]/[7]

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

    http://www.rapidshare.ru/123390

    http://slil.ru/23642128

    Code:
    Язык:      FASM
    Размер:	   3kb
    Сложность: Для новичков
    hidden мне тут сказал, что плагины могут сильно облегчить вам жизнь и скрыть мою задумку.

    доделал

    выдастся ещё часок, сделаю понавороченней =)
     
    #1 taha, 25 Dec 2006
    Last edited: 1 Jan 2007
    2 people like this.
  2. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Very well done...
    Любимый XOR, кудаже без него :)
    На эту ловушку попадётся примерно 98% :D

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

    Валидный Пас найден
     
    #2 hidden, 25 Dec 2006
    Last edited: 27 Dec 2006
    1 person likes this.
  3. taha

    taha Elder - Старейшина

    Joined:
    20 Aug 2006
    Messages:
    399
    Likes Received:
    330
    Reputations:
    251
    Ну и где ответы или хотя бы жаркое обсуждение решения. Неужели за, почти, сутки решили только двое!!??
     
  4. ProTeuS

    ProTeuS --

    Joined:
    26 Nov 2004
    Messages:
    1,239
    Likes Received:
    542
    Reputations:
    445
    какие обсуждения - сессия )

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

    taha Elder - Старейшина

    Joined:
    20 Aug 2006
    Messages:
    399
    Likes Received:
    330
    Reputations:
    251
    >>банальная китайкая сборка все сделает за исследователя
    поэтому я её часто отключаю)), просто когда это юзаешь теряешь навыки

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

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

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

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

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    Прикольно ;)
    Мне понравилась антиотладка. Респект :)
    90% новичков на этом слетят)
    Пасс найден. (Валидный Пас ага :D )

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

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

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

    TAHA, кинь потом плз сорсик ) Хочу посмотреть на реализацию первой антиотладочной фишки :)
     
    #6 _Great_, 27 Dec 2006
    Last edited: 27 Dec 2006
  7. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Тоде честно признаюсь, что не знал, если бы он вынес это в отдельную секцию, и не выкидывал бы на ExitProcess, а просто незаметно код подпортил, думаю часика на пол бы в раздумки загнал.
    Та это мне показалось, что он немного подругому сделал :)
     
  8. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    На самом деле я спалил tls callback на этапе просмотра экзешника в иде. Умная ида послушно обзывает все калбеки как TlsCallback, поэтому по названию все стало ясно)
     
  9. taha

    taha Elder - Старейшина

    Joined:
    20 Aug 2006
    Messages:
    399
    Likes Received:
    330
    Reputations:
    251
    CrackMe[7] by Taha

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

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

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

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

    Пас старый, имхо не суть))!!
     
    #9 taha, 1 Jan 2007
    Last edited: 2 Jan 2007
  10. zl0y

    zl0y Banned

    Joined:
    13 Sep 2006
    Messages:
    371
    Likes Received:
    270
    Reputations:
    109
    Сломано:
    Время:40 секунд
    После взлома выдает happy end =)
    [​IMG]
     
    2 people like this.
  11. taha

    taha Elder - Старейшина

    Joined:
    20 Aug 2006
    Messages:
    399
    Likes Received:
    330
    Reputations:
    251
    CrackMe[7] или что я хотел увидеть

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

    Code:
    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


    От меня: ______________________________________

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

    Code:
    @@:   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

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

    Code:
     0040112A   >-EB FE          JMP SHORT CrackMe[.0040112A
    Вот почему программа подвисала. Тогда как автор(тобишь я) проверяю пасс? По идее после:

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

    Code:
    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. Переходим по нему.

    Code:
    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'а. и выходим на

    Code:
    0040112C   . 83C4 28        ADD ESP,28


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

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


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

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


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

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

    Code:
    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 =)).

    Сорц пробной программы: ____________________________________________________________
    Code:
    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'
    ____________________________________________________________________________________
     
    3 people like this.