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)