Antsmex.com - jeden z crackme by Noname

CO  : antsmex.com (haslo 10 znakow) jeden z crackme
SKAD: http://crackme.home.ml.org    (pozdrowiam Crook'a :)
CZYM: TR 2.50 (http://tr.kstar.com)

Antsmex to malutki crackme (245b) napisany przez Shmana[UCL]. W opisie jest napisane, ze haslo to 10 znakow i postaramy sie je znalezc :). Uruchamiamy program , zeby zobaczyc jak zadziala. Jezeli juz uruchomiles i komp sie zawiesil to masz fuksa :), inaczej pokazuje t Invalid Password!. Teraz pora na nas. Uruchamiamy TR-a wpisujac jako parametr antsmex.com. TR to debugger ,ale troche inny niz np S-ICE,bo sam interpretuje kod który wykonuje !!! Daje to np brak wykrywalonsci, bo to pod nim wszytskie instrukcje sie wykonuja !!!.

Jesli juz jestes w TR to w sekcji kodu zobaczysz cos takiego jak nizej. Wykonujesz teraz kolejne instrukcje F8 lub F10 (BTW: przeczytaj instrukcje).

2664:00FC  0000            ADD       [BX+SI],AL
2664:00FE  0000            ADD       [BX+SI],AL
2664:0100  EB00            JMP       0102          ;start
2664:0102  B409            MOV       AH,09         ;int21 z ah=09 wyswietla
2664:0104  BA4401          MOV       DX,0144       ;lancuch spod adresu z
2664:0107  CD21            INT       21            ;rejestru DX do znaku '$'
2664:0109  B40A            MOV       AH,0A         ;int21 ah=0a wczytuje znaki
2664:010B  BAE901          MOV       DX,01E9       ;zaczynajac od adresu
2664:010E  CD21            INT       21            ;który jest w DX
2664:0110  BFB801          MOV       DI,01B8       ;+---
2664:0113  33D2            XOR       DX,DX         ;|
2664:0115  8A0EEA01        MOV       CL,[01EA]     ;| Ilosc wpisanych znakow
2664:0119  BEEB01          MOV       SI,01EB       ;| do CX.Do SI adres hasla.
2664:011C  8A14            MOV       DL,[SI]       ;| znak z [SI] do DL.
2664:011E  8A05            MOV       AL,[DI]       ;| znak z zakodowanego.
2664:0120  32C2            XOR       AL,DL         ;| XOR oba znaki :) .
2664:0122  8805            MOV       [DI],AL       ;| co powstalo do adresu
2664:0124  46              INC       SI            ;| z DI. Zwieksza SI i DI
2664:0125  47              INC       DI            ;| o 1.
2664:0126  E2F4            LOOP      011C          ;| Jezeli CX>1 wroc do 11c.
2664:0128  FE06B701        INC       [BYTE 01B7]   ;| zwieksza [1b7] o 1.
2664:012C  803EB70105      CMP       [BYTE 01B7],05;| czy rowne 5.
2664:0131  75E0            JNE       0113          ;| jak nie to powrot do 113

Tu sie zatrzymamy. Instrukcje od :11c do :126 wykonuja sie tyle razy ile bylo znakow we wpisanym hasle, czyli skoro ma ich byc 10 wiec wykona sie ta petla 10 razy. Od :1eb sa znaki z twojego hasla.Kod kazdego znaku jest XOR-wany z kolejnymi znakami zaczynajac od :1b8 .[ XOR to suma symetryczna . Instrukcja prownuje kolene bity z obu porownywanych bajtow i wynik zostwia w pierwszym. Zasada jest taka 1+1=0 ,0+0=0, 1+0=1 ,0+1=1 ].Pózniej zwieksza wartosc komorki :1b7 i dopoki nie jest rowna 5, powtarza petle kodujaca zmieniajac kolejne miejsca w pamieci (chyba ciezko to zrozumiec wiec najlepiej sam sprawdz co dzieje sie pod adresem :1b8 i dalej (wpisz 'd 1b8' aby wyswietlic zawartosc pamieci od :1b8 ). Teraz jezeli petla kodujaca wykona sie juz 50 razy to mamy cos takiego

2664:0133  8A4DFE          MOV       CL,[DI-02]    ; znak z [DI-2] do CL
2664:0136  80F924          CMP       CL,24         ; czy CL=24 ?
2664:0139  747D            JE        01B8          ; jak tak to skok do :1b8
2664:013B  B409            MOV       AH,09         ; jesli nie wyswietl
2664:013D  BA9F01          MOV       DX,019F       ; t Invalid Password!
2664:0140  CD21            INT       21            ; i
2664:0142  CD20            INT       20            ; wyjdz z proga
2664:0144  FE20            ???       [BYTE BX+SI]

hmm, jedyne porownanie to czy w [DI-2] jest 24 !! Dobra wrocmy do poczatku wpisz 'reload' i jestes na pierwszej instrukcji :). Trzeba teraz dowiedziec sie co jest w [DI-2] przy starcie programu. Zalozymy pulapke na instrukcji

 :133  MOV       CL,[DI-02]

Wpisz 'BP 133'. 'BL' wyswietli zalozone pulapki Teraz 'reload' a potem 'go' aby uruchomic program (pamietaj wpisz 10 znakow). Program zatrzymal sie i jest cos takiego

2664:0133  8A4DFE          MOV       CL,[DI-02]               (2664:01E8=6E)

Z prawej strony w nawiasach jest adres na który wskazuje [DI-2] i jest to :1e8 i wartosc tej komorki to 6e. Teraz przyda sie sprawdzic w którym momencie ta komorka zmienia wartosc. 'BPM adres_' zatrzyma po instrukcji ktora odczyta lub zmieni wartosc komorki o adresie adres_ , wiec wpisujemy 'bpm 1e8' potem 'reload' i 'go' :) Program stanie po:

2664:011E  8A05            MOV       AL,[DI]

czyli odczytal wartosc komorki [DI]=1e8 i wstawil do AL. Teraz musimy sprawdzic co wstawil do DL, a wlasciwie skad (linijka wyzej)

2664:011C  8A14            MOV       DL,[SI]

Wisujemy 'd si' i pokazuje sie nam 9 znak naszego hasla , fajnie ;) Jeszcze 'go' i znowu 'go' i jestesmy po:

2664:0133  8A4DFE          MOV       CL,[DI-02]

hmmm. [1e8] jest zmieniany tylko raz z 9-tym znakiem z hasla ,a potem jest tylko jedno porownanie czy rowna sie 24. (Wiadomsci niezbedne by cos dalej rozumiec:) XOR l1,l2 da nam l3 teraz XOR l3,l2 da nam l1 !!! ) Dzieki temu mozemy dowiedziec sie jaki jest wlasciwy 9 znak w hasle :) Robimy 'reload' . Teraz sprawdzamy jaka jest pierwotna wartosc pod :1e8

Wpisz 'd 1e8' Zobaczysz 57 (w sekcji wyswietlajacej wartosci komórek pamieci).

2664:01E8  57 40 00 00 00 00 00 00-00 00 00 00 00 06 26 83  W@............&?
2664:01F8  7D 10 01 75 03 FF 4E E4-8D 7E E4 16 57 C4 7E D6  }..u.?N“T~“.WŽ~™

Teraz wykorzystamy inna ceche TR-a.W lini polecenie mozesz wpisywac instrukcje asemblera i TR je wykona !!! Teraz to wykorzystamy aby znalezc znaki z hasla:) Wpisz 'xor [1e8],24' i zobacz jaki jest wynik :)

2664:01E8  73 40 00 00 00 00 00 00-00 00 00 00 00 06 26 83  s@............&?
2664:01F8  7D 10 01 75 03 FF 4E E4-8D 7E E4 16 57 C4 7E D6  }..u.?N“T~“.WŽ~™

No to mamy juz jedna litere to 's' na 9 miejscu w hasle. Jak chcesz to sprawdz jak program zadziala gdy 9 znak to s . Jesli sprawdziles to pewnie system zawisl :) Trzeba teraz sprawdzic reszte miejsc zmienianych przez 's' z hasla. Jesli zostales w TR to 'reload'. Aby miec wieksze okienko sekcji pamieci wpisz 'wd liczba' gdzie liczba oznacza ilosc linii zarezerwowanych na ta sekcje ,np: 'wd 5'.Teraz wpisz 'd 1b8' i krokowo lub recznie sprawdz co,gdzie i na co sie zmienia dzieki 's' na 9 miejscu w hasle.Jezeli doszedles juz tu to zwroc uwage na adres pod który jest skok gdy [1e8] to 24 (spojrz nizej)

2664:0133  8A4DFE          MOV       CL,[DI-02]    ; znak z [DI-2] do CL
2664:0136  80F924          CMP       CL,24         ; czy CL=24 ?
2664:0139  747D            JE        01B8          ; jak tak to skok do :1b8

(BTW: liczby w kodzie sa w systemie szesnastkowym :) jesli ktos tego nie zauwazyl ;) .Prgram wlasnie skacze pod adres który haslo rozkodowuje !!. Jesli nie wiesz jaki znak ma kod 24h to wpisz 'e' i tam zmien wartosc jakiejs komorki na 24h ,a to da '$'.Teraz mozna sie domyslac ze kod spod adresu :1b8 ma wyswietlic jakis lancuch, bo na koncu lancucha musi byc wlasnie znak '$'. Jezeli chcesz t zobacz jak zapisane sa w pamieci nie zakodowane teksty ktore prog wyswietla (juz powinienes ew.powinnas :) wiedziec jak ) 'reload' (rany, który to juz raz :| ) 'xor [1b8+8],73' i masz CD UUuuu... tzn. ze w nastepnym bajcie jest numer przerwania !!! (miedzy adresem a instrukcja masz wlasnie sposób zakodowania tej instrukcji w pamieci zobacz nizej na linie :107) Spojrz teraz w jaki sposób sa uzywane przerwania do wyswietlania lancuchow w programie np tu:

2664:0102  B409            MOV       AH,09         ;int21 z ah=09 wyswietla
2664:0104  BA4401          MOV       DX,0144       ;lancuch spod adresu z
2664:0107  CD21            INT       21            ;rejestru DX do znaku '$'
i jak konczy prace np tu:
2664:0142  CD20            INT       20            ; wyjdz z proga

Jezeli sie zastanawiasz dlaczego mysle ze wyswietla cos i wychodzi, to 1. wyjsc musi ;) 2. w kodzie nie widac zadnego napisu z gratulacjami (lub cos podobnego) ze haslo jest poprawne, no to moze byc tu Wiec, tak do wyswietlenia czegos potrzebne jest 7 bajtow, do zakonczenia pracy 2 bajty, wiec 10 znak moze odkodowac 01 na 20 tzn ze tu prog skonczy.'xor [1b8+9],20' i jest '!'. Dobrze, jezeli tak to wczesniej pewnie jest CD 21 (patrz wyzej ^) , 'xor [1b8+7],21' i 'xor [1b8+6],cd'. I juz sa prawdopodobnie cztery dane znaki z hasla :)).Jezeli dobrze myslimy to wczesniej moze byc albo MOV ah,09 albo mov dx,adres_poczatku_lancucha. Jezeli kolejnosc jest taka jak wczesniej to bedzie MOV DX,adres , a tym adresem moze byc np 1b8+0a. Jak nie wiesz ile to jest to sprawdz '? 1b8+a' = 1c2 :) Sprawdzamy 'xor [1b8+5],01' , 'xor [1bb8+4],c2' , 'xor [1b8+3],ba'. Wszystko wyglada wporzadku wiec sprawdzajmy dalej 'xor [1b8+2],09' , 'xor [1b8+1],b4' Wszystkie odkodowane znaki mozna wpisac bez problemu z klawiatury , ale zostal nam jeszcze jeden nie odkodowany znak. Prog skacze do :1b8, a tu musi byc instrukcja ktora da sie zapisac w 1 bajcie, moze to byc np NOP czyli nic nie rob. Sprawdzamy kod NOP to 90 'xor [1b8],90' jezeli wszystko sie udalo to zobaczysz juz haslo ;) Teraz tylko pozostaje uruchomic i je cale wpisac :) BTW: te dziwne znaczki to z ruskiego, uruchom np: russia.com i bedzie dobrze i Gandjubas! wyglada poprawniej, przekonaj sie dlaczego

Nonme [CrackPL]