-+[ jak zlamac Crackme #8 by Marcus^HTBTeam ]+-

Prog nastukany zostal pod masm32, spakowany fsg1.33. Nasz cel: musimy znalezc
odpowiednia sekwencje buttonow i znalezc prawidlowy serial.
Crackme znalezc mozna na http://www.crackmes.prv.pl/

-+[ disasembler & debug ]+-

No to zaczynamy, rozpakowywujemy crackme i wrzucamy do IDA, znajdujemy
interesujacy nas kawalek kodu:

call sub_4029BF ;random
push offset dword_404512
push 65h
push [ebp+hDlg]
call SetDlgItemTextA
cmp ds:byte_404526, 7
jnz short loc_4027C3

Po nacisnieciu buttona nastepuje losowanie 16 bajtowej liczby.
Kazdy button ma przypisana odpowiednia wartosc, musimy tak ulozyc buttony,
zeby ich suma dala liczbe 7, np. patrzac od lewej: 1,2,4,3. Ok uaktywnilo
nam sie okienko, ciekawe co tym razem przygotowal dla nas Marcus:

push 37h
push offset String
push 66h
push [ebp+hDlg]
call GetDlgItemTextA ;pobieramy string z odkrytego edita
cmp eax, 36h ;jesli jest on krotrzy od 54 bajtow
jnz loc_4029B3 ;to bad boy

String nie moze byc dluzszy poniewaz edit przyjmuje maxymalnie 54 bajtowy
lancuch. Lecimy dalej:

mov eax, ds:String ;pobieramy pierwsze 4 bajty
mov ecx, 0FFh

loc_4024DA:
bswap eax
sub eax, 65465891h
rol eax, 4
not eax
sar eax, 2
or eax, 28538628h
xor eax, 98765432h
shr eax, 3
add eax, 88234241h
neg eax
imul eax, 5
rcr eax, 4
loop loc_4024DA
xor eax, 9EE9C1A5h
test eax, eax
jnz loc_4029B3

Po przejsciu przez to procke eax musi byc 'puste', nie wiem jak wy, ale ja
postanowilem zapuscic skromnego bruta z zakresu '0'..'9' i 'A'..'F',
wynikow jest duzo pierwszy prawidlowy to '3001', w sumie to nie wiem czy
daloby sie to odwrocic, lecimy dalej:

push offset dword_4045A0 ;hash
push 10h ;16 bajtow
push offset dword_404512 ;bajty z edita - tego read only
call sub_401000 ;MD5

Standardowy MD5, po tym nastepuje odwrocenie hasha, poniewaz dwordy zapisane
byly odwrotnie, lecimy dalej:

mov ecx, 10h
mov esi, offset dword_404512

loc_40255D:
xor byte ptr [esi], 20h ;xorowanie stringa z edita read only
inc esi
loop loc_40255D

Kazdy bajt zostaje xorowany ze spacja ;) A co dalej?:

mov esi, offset dword_40452C
call sub_402A6F ;str2hex
bswap eax
mov esi, offset dword_4044E0

4x str2hex po 4 bajty, Marcus posluzyl sie moja troszke schrzaniona procka,
ale skoro sam mowil, ze nie zauwazyl buga to lepiej o tym nie mowic ;) Blad
polega na tym, ze zapomialem ustawic flage [cld], przez co jak bedziesz np.
odczytywac stringa przy pomocy lodsb to bedzie ci czytalo w lewa strone ;P
No, ale nic procke juz poprawilem, zapomialem tylko wrzucic na sait ;):

push offset dword_404512 ;password

call sub_401E16 ;e2_password_set

Marcus wykorzystal implementacje WitkaG, procka ustawia tablice dla E2:

push offset dword_4044E0 ;16bajtow z edita [pomijajac pierwsze 4]

push offset dword_4045C3 ;buffer wynikowy

call sub_402148 ;e2_encrypt

Nic innego jak E2_Encrypt, ok mamy zaszyfrowane bajty, tak wiec lecimy dalej:

mov ecx, 10h
mov esi, offset dword_4045A0
mov edi, offset dword_4045C3
repe cmpsb
jnz loc_4029B3

Porownujemy hash z zaszyfrowanymi bajtami [tymi z E2], jesli roznia sie
miedzy soba to bad boy, so? Musimy przeleciec hash E2_Decrypt i mamy
prawidlowe bajty, pozniej jeszcze hex2str i mozemy leciec dalej:

mov ecx, 0FFh

loc_4025E9:
rcr eax, 4
sar eax, 2
or eax, 28538628h
not eax
rol eax, 4
sub eax, 65465891h
neg eax
imul eax, 5
xor eax, 98765432h
shl eax, 3
sub eax, 88234241h
bswap eax
loop loc_4025E9
xor eax, 6F3F8A89h
test eax, eax
jnz loc_4029B3

Kolejna procka, ktora proponowalbym przeleciec b-f, jak w poprzednim
przypadku jest duzo odpowiednich bajtow, ja wzialem przerwsza lepsza:
'1000', bedzie to kolejna stala w naszym serialu.

mov ecx, 10h
mov esi, offset dword_404512
xor edi, edi

loc_40262D:
xor eax, eax
mov al, [esi]
add edi, eax
inc esi
loop loc_40262D
xchg eax, edi
mov cl, ds:byte_404526
imul eax, ecx
mov ds:dword_4045E6, eax

Z naszego niby name [bajty z edita read only], sumowane sa wszystkie bajty
do qpy i mnozone przez ecx, tak otrzymane bajty odkladamy na pozniej:

mov ecx, 0Ah

mov esi, offset dword_404155 ;siedzi tu sobie staly string

xor eax, eax

loc_402651:
mov ebx, ds:dword_4045E6 ;uprzednio zapamietana wartosc
mov al, [esi]

loc_402659:
inc eax
dec ebx
cmp al, 3Ah
jnz short loc_402661
mov al, 41h

loc_402661:
cmp al, 47h
jnz short loc_402667
mov al, 30h

loc_402667:
cmp ebx, 0
jnz short loc_402659
mov [esi], al
inc esi
loop loc_402651

W sumie kazdy widzi co robi ta procka co nie? Wartosc jest znana tak wiec
nie ma co sie za duzo nia interesowac, lecimy dalej:

mov ecx, 0Ah
mov esi, offset dword_404550
xor eax, eax

loc_40267D:
mov ebx, 72h
mov al, [esi]

loc_402684:
inc eax
dec ebx
cmp al, 3Ah
jnz short loc_40268C
mov al, 41h

loc_40268C:
cmp al, 47h
jnz short loc_402692
mov al, 30h

loc_402692:
cmp ebx, 0
jnz short loc_402684
mov [esi], al
inc esi
loop loc_40267D

Jesli chodzi o ta procke to trzeba sie nia troszke zainteresowac poniewaz
odpowiada ona za sprawdzenie poprawnosci kolejnych bajtow seriala, a wiec po
krotce: przepuszczany jest tu string z poprzedniej procki, sam na poczatku
nie wiedzialem o co sie tu rozchodzi, ale jak sie dobrze przygladniemy to
aby ja odwrocic nalezy zrobic poprostu:

od wartosci: '2..9' i 'C'..'F' odejmujemy 02h

wartosci: zamieniamy na:

'A' - '8'

'B' - '9'

'1' - 'F'

'0' - 'E'

Czyli dokladniej mowiac jest to poprostu odejmowanie, a ze operujemy na str
a nie na hex musimy zamieniac 'A' na '8' itd., ok procke mamy juz za soba:

mov ecx, 0Ah
mov esi, offset byte_404559
mov edi, offset byte_40415E
repe cmpsb
jnz loc_4029B3

Tu wlasnie nastepuje porownanie ow stringow, jesli sa takie same to lecimy
dalej:

mov eax, ds:dword_40455A
mov ecx, 0FFh

loc_4026BD:
rcr eax, 4
add eax, 65465891h
bswap eax
sar eax, 2
sub eax, 88234241h
neg eax
imul eax, 5
xor eax, 98765432h
shl eax, 3
or eax, 28538628h
not eax
ror eax, 4
loop loc_4026BD
xor eax, 7D48C29Dh
test eax, eax
jnz loc_4029B3

Ostatnia juz procka, rowniez tutaj proponowalbym wstawic stala wartosc,
np. 'R100'. Wszystkie stale wartosci, ktore tu zastosowalismy mozna
wyliczac za kazdym razem co daje nam rozne seriale dla jednego 'name', ale
zrezygnowalem z tego poniewaz serial wyliczany byl przez parenascie
sekund, a komu chcialoby sie tyle czekac?
Ok, po przejsciu przez to procke naszym oczom ukazuje sie msgbox, a w
zwiazku z tym, ze jestem m.in. z HTB napisalem ow tuta ;P

-+[ podsumowanie ]+-

Fajne crackme, w sam raz na niedzielne popoludnie po ciezkim i zmudnym
odkurzaniu podlog ;) Nie bede umieszczal tu przykladowych seriali poniewaz
'name' i tak jest randomowe ;) Keygena znalezc mozna na mojej stronie.

jopas/htb+rag web: http://www.jopas.prv.pl/

-+[ end ]+-