Date de publication : vendredi 26 mai 2006
Auteur : BeatriX
Maintenant que nous disposons de toutes les routines, nous pouvons créer les algorithmes pour récupérer l'argument.
Avant d'attaquer par recherches exhaustives, nous pouvons déterminer les 4 derniers caractères à la main. Voici un schéma (établi suivant la routine qui débute en 4028A4) qui illustre la marche à suivre :

Les 4 derniers caractères de l'argument vont servir d'indices dans une table hardcodée. Par exemple, le caractère "1", soit 31h, permet de récupérer la suite F722 en allant voir dans la table à la ligne 3 et à la ligne 1. Nous pouvons aisément faire le travail à l'envers. Nous obtenons pour les 4 derniers chars "1cxm".
Nous attaquons maintenant les 4 premiers chars dont la somme et le produit sont utilisés dans des boucles de calculs pour obtenir 389-76693500. Les 4 caractères seront stockés dans chaine_. La routine INCREMENTE permet d'incrémenter chaine_ en cas d'échec d'un test. C'est une routine récursive qui considère chaine_ comme un compteur (style compteur kilométrique).
.data
ptrChaine dword 0
chaine_ byte 8 DUP(30h)
CalculEAX MACRO
mov eax, 0CCCCCCCDh
mul ecx
shr edx, 3
lea eax, dword ptr [edx+edx*4]
add eax, eax
sub cl, al
mov al, cl
add al, 30h
ENDM
.code
mov eax, offset chaine_
mov ptrChaine, eax
@_:
movzx eax, byte ptr [chaine_]
movzx ecx, byte ptr [chaine_+1]
add eax, ecx
movzx ecx, byte ptr [chaine_+2]
add eax, ecx
movzx ecx, byte ptr [chaine_+3]
add eax, ecx
mov ecx, eax
CalculEAX
mov ecx, edx
cmp al, 39h
je @F
call INCREMENTE
jmp @_
@@:
CalculEAX
mov ecx, edx
cmp al, 38h
je @F
call INCREMENTE
jmp @_
@@:
CalculEAX
cmp al, 33h
je @F
call INCREMENTE
jmp @_
@@:
movzx eax, byte ptr [chaine_]
movzx ecx, byte ptr [chaine_+1]
imul eax, ecx
movzx ecx, byte ptr [chaine_+2]
imul eax, ecx
movzx ecx, byte ptr [chaine_+3]
imul eax, ecx
mov ecx, eax
CalculEAX
cmp al, 30h
je @F
call INCREMENTE
jmp @_
@@:
mov ecx, edx
CalculEAX
cmp al, 30h
je @F
call INCREMENTE
jmp @_
@@:
mov ecx, edx
CalculEAX
cmp al, 35h
je @F
call INCREMENTE
jmp @_
@@:
mov ecx, edx
CalculEAX
cmp al, 33h
je @F
call INCREMENTE
jmp @_
@@:
mov ecx, edx
CalculEAX
cmp al, 39h
je @F
call INCREMENTE
jmp @_
@@:
mov ecx, edx
CalculEAX
cmp al, 36h
je @F
call INCREMENTE
jmp @_
@@:
mov ecx, edx
CalculEAX
cmp al, 36h
je @F
call INCREMENTE
jmp @_
@@:
mov ecx, edx
CalculEAX
cmp al, 37h
je @F
call INCREMENTE
jmp @_
@@:
push 0
call ExitProcess
; =================== routine récursive pour incrémenter un compteur
INCREMENTE PROC
mov edx, ptrChaine
mov bl, byte ptr [edx]
.if bl!=7Ah
.if bl==39h
mov byte ptr [edx], 61h
.else
inc byte ptr [edx]
.endif
ret
.else
mov byte ptr [edx],30h
inc ptrChaine
call INCREMENTE
dec ptrChaine
ret
.endif
INCREMENTE ENDP
Ce bruteforce nous donne en quelques secondes les 24 possibilités suivantes (nombre de permutations de 4 caractères distincts) : usd9, sud9, uds9, dus9, sdu9, dsu9, 9usd, 9sud, 9uds, 9dus, 9sdu, 9dsu, u9sd, s9ud, u9ds, d9us, s9du, d9su, us9d, su9d, ud9s, du9s, sd9u, ds9u. Le hash MD5 nous permettra au final de déterminer la bonne combinaison !
Voici la routine :
mov eax, offset chaine_
mov ptrChaine, eax
@1:
movzx eax, byte ptr [chaine_]
shr al, 5
movzx edx, byte ptr [chaine_+5]
lea ecx, dword ptr [edx*8]
and ecx, 0F8h
or ecx, eax
cmp ecx, 3Bh
je @F
call INCREMENTE
jmp @1
@@:
movzx eax, byte ptr [chaine_+5]
shr al, 5
movzx edx, byte ptr [chaine_+4]
lea ecx, dword ptr [edx*8]
and ecx, 0F8h
or ecx, eax
cmp ecx, 8Bh
je @F
call INCREMENTE
jmp @1
@@:
movzx eax, byte ptr [chaine_+4]
shr al, 5
movzx edx, byte ptr [chaine_+3]
lea ecx, dword ptr [edx*8]
and ecx, 0F8h
or ecx, eax
cmp ecx, 41h
je @F
call INCREMENTE
jmp @1
@@:
movzx eax, byte ptr [chaine_+3]
shr al, 5
movzx edx, byte ptr [chaine_+2]
lea ecx, dword ptr [edx*8]
and ecx, 0F8h
or ecx, eax
cmp ecx, 0Bh
je @F
call INCREMENTE
jmp @1
@@:
movzx eax, byte ptr [chaine_+2]
shr al, 5
movzx edx, byte ptr [chaine_+1]
lea ecx, dword ptr [edx*8]
and ecx, 0F8h
or ecx, eax
cmp ecx, 83h
je @F
call INCREMENTE
jmp @1
@@:
movzx eax, byte ptr [chaine_+1]
shr al, 5
movzx edx, byte ptr [chaine_]
lea ecx, dword ptr [edx*8]
and ecx, 0F8h
or ecx, eax
cmp ecx, 21h
je @F
call INCREMENTE
jmp @1
@@:
push 0
call ExitProcess
Nous n'obtenons que la possibilité suivante : d0ah1g
Après quelques calculs sur ces caractères, nous devons obtenir le dword 49AD83E7h
.data
; ======== table en 410000 rippée
Table_ db 000h, 000h, 000h, 000h, 096h, 030h, 007h, 077h
db 02Ch, 061h, 00Eh, 0EEh, 0BAh, 051h, 009h, 099h
db 019h, 0C4h, 06Dh, 007h, 08Fh, 0F4h, 06Ah, 070h
db 035h, 0A5h, 063h, 0E9h, 0A3h, 095h, 064h, 09Eh
db 032h, 088h, 0DBh, 00Eh, 0A4h, 0B8h, 0DCh, 079h
db 01Eh, 0E9h, 0D5h, 0E0h, 088h, 0D9h, 0D2h, 097h
db 02Bh, 04Ch, 0B6h, 009h, 0BDh, 07Ch, 0B1h, 07Eh
db 007h, 02Dh, 0B8h, 0E7h, 091h, 01Dh, 0BFh, 090h
db 064h, 010h, 0B7h, 01Dh, 0F2h, 020h, 0B0h, 06Ah
db 048h, 071h, 0B9h, 0F3h, 0DEh, 041h, 0BEh, 084h
db 07Dh, 0D4h, 0DAh, 01Ah, 0EBh, 0E4h, 0DDh, 06Dh
db 051h, 0B5h, 0D4h, 0F4h, 0C7h, 085h, 0D3h, 083h
db 056h, 098h, 06Ch, 013h, 0C0h, 0A8h, 06Bh, 064h
db 07Ah, 0F9h, 062h, 0FDh, 0ECh, 0C9h, 065h, 08Ah
db 04Fh, 05Ch, 001h, 014h, 0D9h, 06Ch, 006h, 063h
db 063h, 03Dh, 00Fh, 0FAh, 0F5h, 00Dh, 008h, 08Dh
db 0C8h, 020h, 06Eh, 03Bh, 05Eh, 010h, 069h, 04Ch
db 0E4h, 041h, 060h, 0D5h, 072h, 071h, 067h, 0A2h
db 0D1h, 0E4h, 003h, 03Ch, 047h, 0D4h, 004h, 04Bh
db 0FDh, 085h, 00Dh, 0D2h, 06Bh, 0B5h, 00Ah, 0A5h
db 0FAh, 0A8h, 0B5h, 035h, 06Ch, 098h, 0B2h, 042h
db 0D6h, 0C9h, 0BBh, 0DBh, 040h, 0F9h, 0BCh, 0ACh
db 0E3h, 06Ch, 0D8h, 032h, 075h, 05Ch, 0DFh, 045h
db 0CFh, 00Dh, 0D6h, 0DCh, 059h, 03Dh, 0D1h, 0ABh
db 0ACh, 030h, 0D9h, 026h, 03Ah, 000h, 0DEh, 051h
db 080h, 051h, 0D7h, 0C8h, 016h, 061h, 0D0h, 0BFh
db 0B5h, 0F4h, 0B4h, 021h, 023h, 0C4h, 0B3h, 056h
db 099h, 095h, 0BAh, 0CFh, 00Fh, 0A5h, 0BDh, 0B8h
db 09Eh, 0B8h, 002h, 028h, 008h, 088h, 005h, 05Fh
db 0B2h, 0D9h, 00Ch, 0C6h, 024h, 0E9h, 00Bh, 0B1h
db 087h, 07Ch, 06Fh, 02Fh, 011h, 04Ch, 068h, 058h
db 0ABh, 01Dh, 061h, 0C1h, 03Dh, 02Dh, 066h, 0B6h
db 090h, 041h, 0DCh, 076h, 006h, 071h, 0DBh, 001h
db 0BCh, 020h, 0D2h, 098h, 02Ah, 010h, 0D5h, 0EFh
db 089h, 085h, 0B1h, 071h, 01Fh, 0B5h, 0B6h, 006h
db 0A5h, 0E4h, 0BFh, 09Fh, 033h, 0D4h, 0B8h, 0E8h
db 0A2h, 0C9h, 007h, 078h, 034h, 0F9h, 000h, 00Fh
db 08Eh, 0A8h, 009h, 096h, 018h, 098h, 00Eh, 0E1h
db 0BBh, 00Dh, 06Ah, 07Fh, 02Dh, 03Dh, 06Dh, 008h
db 097h, 06Ch, 064h, 091h, 001h, 05Ch, 063h, 0E6h
db 0F4h, 051h, 06Bh, 06Bh, 062h, 061h, 06Ch, 01Ch
db 0D8h, 030h, 065h, 085h, 04Eh, 000h, 062h, 0F2h
db 0EDh, 095h, 006h, 06Ch, 07Bh, 0A5h, 001h, 01Bh
db 0C1h, 0F4h, 008h, 082h, 057h, 0C4h, 00Fh, 0F5h
db 0C6h, 0D9h, 0B0h, 065h, 050h, 0E9h, 0B7h, 012h
db 0EAh, 0B8h, 0BEh, 08Bh, 07Ch, 088h, 0B9h, 0FCh
db 0DFh, 01Dh, 0DDh, 062h, 049h, 02Dh, 0DAh, 015h
db 0F3h, 07Ch, 0D3h, 08Ch, 065h, 04Ch, 0D4h, 0FBh
db 058h, 061h, 0B2h, 04Dh, 0CEh, 051h, 0B5h, 03Ah
db 074h, 000h, 0BCh, 0A3h, 0E2h, 030h, 0BBh, 0D4h
db 041h, 0A5h, 0DFh, 04Ah, 0D7h, 095h, 0D8h, 03Dh
db 06Dh, 0C4h, 0D1h, 0A4h, 0FBh, 0F4h, 0D6h, 0D3h
db 06Ah, 0E9h, 069h, 043h, 0FCh, 0D9h, 06Eh, 034h
db 046h, 088h, 067h, 0ADh, 0D0h, 0B8h, 060h, 0DAh
db 073h, 02Dh, 004h, 044h, 0E5h, 01Dh, 003h, 033h
db 05Fh, 04Ch, 00Ah, 0AAh, 0C9h, 07Ch, 00Dh, 0DDh
db 03Ch, 071h, 005h, 050h, 0AAh, 041h, 002h, 027h
db 010h, 010h, 00Bh, 0BEh, 086h, 020h, 00Ch, 0C9h
db 025h, 0B5h, 068h, 057h, 0B3h, 085h, 06Fh, 020h
db 009h, 0D4h, 066h, 0B9h, 09Fh, 0E4h, 061h, 0CEh
db 00Eh, 0F9h, 0DEh, 05Eh, 098h, 0C9h, 0D9h, 029h
db 022h, 098h, 0D0h, 0B0h, 0B4h, 0A8h, 0D7h, 0C7h
db 017h, 03Dh, 0B3h, 059h, 081h, 00Dh, 0B4h, 02Eh
db 03Bh, 05Ch, 0BDh, 0B7h, 0ADh, 06Ch, 0BAh, 0C0h
db 020h, 083h, 0B8h, 0EDh, 0B6h, 0B3h, 0BFh, 09Ah
db 00Ch, 0E2h, 0B6h, 003h, 09Ah, 0D2h, 0B1h, 074h
db 039h, 047h, 0D5h, 0EAh, 0AFh, 077h, 0D2h, 09Dh
db 015h, 026h, 0DBh, 004h, 083h, 016h, 0DCh, 073h
db 012h, 00Bh, 063h, 0E3h, 084h, 03Bh, 064h, 094h
db 03Eh, 06Ah, 06Dh, 00Dh, 0A8h, 05Ah, 06Ah, 07Ah
db 00Bh, 0CFh, 00Eh, 0E4h, 09Dh, 0FFh, 009h, 093h
db 027h, 0AEh, 000h, 00Ah, 0B1h, 09Eh, 007h, 07Dh
db 044h, 093h, 00Fh, 0F0h, 0D2h, 0A3h, 008h, 087h
db 068h, 0F2h, 001h, 01Eh, 0FEh, 0C2h, 006h, 069h
db 05Dh, 057h, 062h, 0F7h, 0CBh, 067h, 065h, 080h
db 071h, 036h, 06Ch, 019h, 0E7h, 006h, 06Bh, 06Eh
db 076h, 01Bh, 0D4h, 0FEh, 0E0h, 02Bh, 0D3h, 089h
db 05Ah, 07Ah, 0DAh, 010h, 0CCh, 04Ah, 0DDh, 067h
db 06Fh, 0DFh, 0B9h, 0F9h, 0F9h, 0EFh, 0BEh, 08Eh
db 043h, 0BEh, 0B7h, 017h, 0D5h, 08Eh, 0B0h, 060h
db 0E8h, 0A3h, 0D6h, 0D6h, 07Eh, 093h, 0D1h, 0A1h
db 0C4h, 0C2h, 0D8h, 038h, 052h, 0F2h, 0DFh, 04Fh
db 0F1h, 067h, 0BBh, 0D1h, 067h, 057h, 0BCh, 0A6h
db 0DDh, 006h, 0B5h, 03Fh, 04Bh, 036h, 0B2h, 048h
db 0DAh, 02Bh, 00Dh, 0D8h, 04Ch, 01Bh, 00Ah, 0AFh
db 0F6h, 04Ah, 003h, 036h, 060h, 07Ah, 004h, 041h
db 0C3h, 0EFh, 060h, 0DFh, 055h, 0DFh, 067h, 0A8h
db 0EFh, 08Eh, 06Eh, 031h, 079h, 0BEh, 069h, 046h
db 08Ch, 0B3h, 061h, 0CBh, 01Ah, 083h, 066h, 0BCh
db 0A0h, 0D2h, 06Fh, 025h, 036h, 0E2h, 068h, 052h
db 095h, 077h, 00Ch, 0CCh, 003h, 047h, 00Bh, 0BBh
db 0B9h, 016h, 002h, 022h, 02Fh, 026h, 005h, 055h
db 0BEh, 03Bh, 0BAh, 0C5h, 028h, 00Bh, 0BDh, 0B2h
db 092h, 05Ah, 0B4h, 02Bh, 004h, 06Ah, 0B3h, 05Ch
db 0A7h, 0FFh, 0D7h, 0C2h, 031h, 0CFh, 0D0h, 0B5h
db 08Bh, 09Eh, 0D9h, 02Ch, 01Dh, 0AEh, 0DEh, 05Bh
db 0B0h, 0C2h, 064h, 09Bh, 026h, 0F2h, 063h, 0ECh
db 09Ch, 0A3h, 06Ah, 075h, 00Ah, 093h, 06Dh, 002h
db 0A9h, 006h, 009h, 09Ch, 03Fh, 036h, 00Eh, 0EBh
db 085h, 067h, 007h, 072h, 013h, 057h, 000h, 005h
db 082h, 04Ah, 0BFh, 095h, 014h, 07Ah, 0B8h, 0E2h
db 0AEh, 02Bh, 0B1h, 07Bh, 038h, 01Bh, 0B6h, 00Ch
db 09Bh, 08Eh, 0D2h, 092h, 00Dh, 0BEh, 0D5h, 0E5h
db 0B7h, 0EFh, 0DCh, 07Ch, 021h, 0DFh, 0DBh, 00Bh
db 0D4h, 0D2h, 0D3h, 086h, 042h, 0E2h, 0D4h, 0F1h
db 0F8h, 0B3h, 0DDh, 068h, 06Eh, 083h, 0DAh, 01Fh
db 0CDh, 016h, 0BEh, 081h, 05Bh, 026h, 0B9h, 0F6h
db 0E1h, 077h, 0B0h, 06Fh, 077h, 047h, 0B7h, 018h
db 0E6h, 05Ah, 008h, 088h, 070h, 06Ah, 00Fh, 0FFh
db 0CAh, 03Bh, 006h, 066h, 05Ch, 00Bh, 001h, 011h
db 0FFh, 09Eh, 065h, 08Fh, 069h, 0AEh, 062h, 0F8h
db 0D3h, 0FFh, 06Bh, 061h, 045h, 0CFh, 06Ch, 016h
db 078h, 0E2h, 00Ah, 0A0h, 0EEh, 0D2h, 00Dh, 0D7h
db 054h, 083h, 004h, 04Eh, 0C2h, 0B3h, 003h, 039h
db 061h, 026h, 067h, 0A7h, 0F7h, 016h, 060h, 0D0h
db 04Dh, 047h, 069h, 049h, 0DBh, 077h, 06Eh, 03Eh
db 04Ah, 06Ah, 0D1h, 0AEh, 0DCh, 05Ah, 0D6h, 0D9h
db 066h, 00Bh, 0DFh, 040h, 0F0h, 03Bh, 0D8h, 037h
db 053h, 0AEh, 0BCh, 0A9h, 0C5h, 09Eh, 0BBh, 0DEh
db 07Fh, 0CFh, 0B2h, 047h, 0E9h, 0FFh, 0B5h, 030h
db 01Ch, 0F2h, 0BDh, 0BDh, 08Ah, 0C2h, 0BAh, 0CAh
db 030h, 093h, 0B3h, 053h, 0A6h, 0A3h, 0B4h, 024h
db 005h, 036h, 0D0h, 0BAh, 093h, 006h, 0D7h, 0CDh
db 029h, 057h, 0DEh, 054h, 0BFh, 067h, 0D9h, 023h
db 02Eh, 07Ah, 066h, 0B3h, 0B8h, 04Ah, 061h, 0C4h
db 002h, 01Bh, 068h, 05Dh, 094h, 02Bh, 06Fh, 02Ah
db 037h, 0BEh, 00Bh, 0B4h, 0A1h, 08Eh, 00Ch, 0C3h
db 01Bh, 0DFh, 005h, 05Ah, 08Dh, 0EFh, 002h, 02Dh
.code
mov eax, offset chaine_
mov ptrChaine, eax
@@:
mov ebx, ptrChaine
xor edi, edi
movzx edx, byte ptr [ebx]
xor edx, edi
movzx ecx, dl
mov edx, dword ptr [ecx*4+Table_]
shr edi, 8
xor edi, edx
inc ebx
movzx edx, byte ptr [ebx]
xor edx, edi
movzx ecx, dl
mov edx, dword ptr [ecx*4+Table_]
shr edi, 8
xor edi, edx
inc ebx
movzx edx, byte ptr [ebx]
xor edx, edi
movzx ecx, dl
mov edx, dword ptr [ecx*4+Table_]
shr edi, 8
xor edi, edx
inc ebx
movzx edx, byte ptr [ebx]
xor edx, edi
movzx ecx, dl
mov edx, dword ptr [ecx*4+Table_]
shr edi, 8
xor edi, edx
inc ebx
movzx edx, byte ptr [ebx]
xor edx, edi
movzx ecx, dl
mov edx, dword ptr [ecx*4+Table_]
shr edi, 8
xor edi, edx
inc ebx
movzx edx, byte ptr [ebx]
xor edx, edi
movzx ecx, dl
mov edx, dword ptr [ecx*4+Table_]
shr edi, 8
xor edi, edx
cmp edi, 49AD83E7h
je @F
call INCREMENTE
jmp @B
@@:
push 0
call ExitProcess
Nous obtenons deux possibilités : webdsc, k6q9fw
Nous obtenons au final 48 candidats potentiels (24*2) pour devenir le bon argument. Seul celui qui franchira le test du MD5 survivra...48...ça se fait à la main hein ;)
Je rappelle ici la solution : s9dud0ah1gk6q9fw1cxm !!
Copyright (C)- FRET (2006)