The +O Selftest for Crackers
LordByte Cracking Challange version 1.0
Tutorial (v1.0) by Lucifer48 [Immortal Descendants]
(12 Août 1999)
Contents:
Introduction
Very Very Easy
Very Easy
Easy
Not Entirely Easy
Somewhat Harder
Hard
Introduction:
Je n'ai résolu que 5 tests sur 7, (Not Entirely Easy & Very Hard). Ce dernier est carrément un
truc de fou, il est énorme, j'ai abandonné (je doute que quelqu'un soit assez courageux pour
résourdre ça !). Quand à l'autre c'est une brute force à 9 caractères donc ça prend du temps...
Si vous avez des infos: d'autres combinaisons (pour Hard), word du (Not Entirely Easy) ou la
pass-phrase (Very Hard), ou autre chose qui est susceptible de faire avancer ce tut; écrivez moi à
lucifer48@yahoo.com. Je serais ravi d'updater ce tutorial.
Very Very Easy:
C'est une simple comparaison...
XXXX:0043B032 LEA EDX,[EBP-04] ;[EBP-04] va contenir l'adresse du serial
XXXX:0043B035 MOV EAX,[EBX+00000258]
XXXX:0043B03B CALL 0041AED4 ;lit le serial
XXXX:0043B040 MOV EAX,[EBP-04] ;notre serial
XXXX:0043B043 MOV EDX,0043B09C ;button
XXXX:0043B048 CALL 00403A44 ;comparaison
XXXX:0043B04D JNZ 0043B05B ;jump = bad cracker!
What word am I thinking of ? button
Very Easy:
Allons y...
XXXX:0043B1D7 CALL 0041AED4 ;lecture du nom
XXXX:0043B1DC MOV EAX,[EBP-08] ;mon nom
XXXX:0043B1DF CALL 00403934
XXXX:0043B1E4 MOV EBX,EAX ;contient la taille du nom
XXXX:0043B1E6 TEST EBX,EBX ;a t'on rentré un nom ?
XXXX:0043B1E8 JLE 043B20E
XXXX:0043B1EA MOV ESI,00000001
XXXX:0043B1EF LEA EDX,[EBP-08] ;va contenir l'adresse du nom..
XXXX:0043B1F2 MOV EAX,[EBP-04] ;alors qu'elle est déjà là...
XXXX:0043B1F5 MOV EAX,[EAX+00000280] ;qu'il est con ce delphi ;)
XXXX:0043B1FB CALL 0041AED4 ;lecture du nom (encore...)
XXXX:0043B200 MOV EAX,[EBP-08] ;d EAX: mon nom
XXXX:0043B203 MOVZX EAX,BYTE PTR [ESI+EAX-01] ;charge le ESI ème caractère du nom
XXXX:0043B208 ADD EDI,EAX ;EDI vaut initialement: 031422DD
XXXX:0043B20A INC ESI ;caractère suivant
XXXX:0043B20B DEC EBX
XXXX:0043B20C JNZ 0043B1EF ;boucle
Cette modeste boucle additionne donc la valeur ascii de chaque caractère du nom, + 031422DD,
ce qui donne un joli checksum sur 32 bits. Un peu plus loin...
XXXX:0043B228 CALL 00406870 ;lecture du serial
XXXX:0043B22D MOV EAX,[EBP-08] ;d EAX: mon serial
XXXX:0043B230 CALL 00406870 ;conversion héxadécimale (résultat en EAX)
XXXX:0043B235 CMP EDI,EAX ;comparaison
XXXX:0043B237 JNZ 0043B245 ;faut que ça soit égal!
Pour mon nom j'obtiens:
31422DDh + 4Ch + 75h + 63h + 69h + 66h + 65h + 72h + 34h + 38h = 3142613h
et deplus, 3142613h = 51652115d donc...
Name/ Lucifer48
Serial/ 51652115
A noter que ce genre de protection peut être rencontré dans de nombreux sharewares.
Easy:
Bien qu'on soit autorisé à patcher, je ne le ferais pas... On veut devenir est VRAIs crackers
oui ou non ? A l'issu d'une boucle, on aboutit a quelques (2 en fait) comparaisons:
XXXX:0043B3FA CMP ESI,00003810
XXXX:0043B400 JNZ 0043B40A
XXXX:0043B402 CMP EBX,402A4FE7
XXXX:0043B408 JZ 0043B424
...
XXXX:0043B424 MOV EAX,EBX ;on est sur que EBX=402A4FE7
XXXX:0043B426 SUB EAX,ESI ;et que ESI=00003810 donc...
XXXX:0043B428 CMP EAX,402A17D7 ;le test est forcément vérifié !
XXXX:0043B42D JZ 0043B449 ;donc ici JZ = JMP
...
XXXX:0043B449 MOV EAX,EBX ;encore une fois, on est sur que EBX=402A4FE7
XXXX:0043B44B ADD EAX,EAX ;402A4FE7 + 402A4FE7 = 80549FEC
XXXX:0043B44D LEA EDX,[ESI*2+ESI] ;ESI=00003810 donc 3*ESI=00007020
XXXX:0043B450 ADD EAX,EDX ;80549FEC + 00007020 = 805547FE
XXXX:0043B452 CMP EAX,805547FE
XXXX:0043B457 JZ 0043B473 ;ici encore, JZ = JMP
Passons maintenant à ce que fait la boucle. La boucle la plus interne fait la chose suivante:
Posons Xk le k-ème caractère du serial, EDI faut initialement 1 et il s'itère jusqu'à la longueur
du serial.
ESI= Xk + ESI + EDI
EBX= (2*EBX XOR ESI) + ESI MOD EDI + 1
Supposons que le serial fait n caractères, je note X1, X2, ..., Xk, ..., Xn les caratères
du serial.
A la fin de la boucle (interne):
ESI = (1 + 2 + ... + n ) + X1 + X2 + ... + Xn
= n*(n+1)/2 + Sigma(1,n,k) Xk (k est l'indice de boucle qui varie de 0 à n)
Sachant que la deuxième boucle (la plus externe), répète simplement 10h fois la boucle interne,
alors, on peut calculer ESI final (celui qui va être comparé).
ESI (final)= 8*n*(n+1) + 16*Sigma(1,n,k) Xk
Et on sait que ESI doit valoir 00003810, et que 00003810 / 10h = 381
donc conclusion: 381h = n*(n+1)/2 + Sigma(1,n,k) Xk (*)
(*) Cette equation va donc beaucoup nous aider pour notre brute force attack (à vrai dire, je vois
pas d'autres méthodes !) ça va en effet enlever pas mal de possibilités.
XXXX:0043B3F0 DEC DWORD PTR [EBP-0C]
XXXX:0043B3F3 JNZ 0043B3C3 ;boucle interne
XXXX:0043B3F5 DEC DWORD PTR [EBP-08]
XXXX:0043B3F8 JNZ 0043B39E ;boucle externe
Remarque: En effectuant un rapide calcul, on peut présentir que le serial (le word) fait 8
caractères de long. En effet:
7 chars: 381h-1Ch = 365h et 365h / 7 = 7Ch (moyenne des valeurs ascii des caractères)
8 chars: 381h-24h = 35Dh et 35Dh / 8 = 6Bh
9 chars: 381h-2Dh = 354h et 354h / 9 = 5Eh
On devine aussi que le word se terminera par une lettre e, un peu de brute force (voir ma
source en asm), et on obtient:
What word am I thinking of ? firmware
Not Entirely Easy:
Ce test est excatement le même (à deux instructions près) que le précédent.
XXXX:0043B593 MOV EAX,ESI
XXXX:0043B595 CDQ
XXXX:0043B596 IDIV EDI ;EDI varie de 1 à longueur-du-serial
XXXX:0043B598 ADD EDX,03
XXXX:0043B59B SUB EBX,EDX
XXXX:0043B59D INC EDI
XXXX:0043B59E DEC DWORD PTR [EBP-0C] ;boucle interne
XXXX:0043B5A1 JNZ 0043B56F
XXXX:0043B5A3 DEC DWORD PTR [EBP-08] ;16 boucles (comme le test précédent)
XXXX:0043B5A6 JNZ 0043B54A
XXXX:0043B5A8 CMP ESI,00004100
XXXX:0043B5AE JNZ 0043B5B8
XXXX:0043B5B0 CMP EBX,F61D4A8F
XXXX:0043B5B6 JZ 0043B5D2 ;jmp = good cracker!
Comme ci-dessus voilà les deux formules:
ESI= Xk + ESI + EDI
EBX= (2*EBX XOR ESI) - ESI MOD EDI - 3
Vous voyez c'est pas très différent ! Et comme ci-dessus, on va se reservir de ca:
410h = n*(n+1)/2 + Sigma(1,n,k) Xk pour écarter des possibilités.
On devine (on espère...) que le word est en minuscules.
7 chars: 410h-1Ch = 3F4h et 3F4h / 7 = 90h (ca fait beaucoup...)
8 chars: 410h-24h = 3ECh et 3ECh / 8 = 7Dh (c'est trop aussi)
9 chars: 410h-2Dh = 3E3h et 3E3h / 9 = 6Eh <--- ca devrait aller
A chars: 410h-37h = 3D9h et 3D9h / A = 62h (trop petit ci c'est que des minuscules)
Espérons que le serial face bien 9 caractères...
Je vois pas d'autres solutions ici que la brute force dommage (voir source).
Somewhat Harder:
Grace W32Dasm et aux Strings Refs, (en particulier à "Correct Key ! ..."), on peut mettre un bpx
au bon endroit.
XXXX:0043B8CF CALL 00403B38
XXXX:0043B8D4 MOV EAX,[EBP-04]
XXXX:0043B8D7 CALL 00406870 ;EAX contient la valeur du slide
XXXX:0043B8DC IMUL EBX,EAX,000DEAAD
...
Soient X1, X2, ..., X8 les valeurs des 8 slides. Que fait ce test:
- Pour EBX: (X6*DEAAD + X3*4EF8F) XOR (X4*C94CD) XOR (X7*43421h) == 620D34h
- Pour ESI: ( ((X2*8AF) XOR (X8*8A040)) + (X1*674E8) ) XOR (X5*97AC5) == C366F9h
Deux fois, quatres inconnus (seulement), trop facile...
Voir source en pascal, qui donne la solution:
86257479
Key Status: Valid !!!!!
Hard:
Comme pour le test précédent, W32Dasm nous aide à trouver l'adresse pour mettre un bpx.
XXXX:0043BB7F MOV EDI,39F51B20
XXXX:0043BB84 MOV DWORD PTR [ESP],118DF6E7
XXXX:0043BB8B MOV ESI,202937CD
XXXX:0043BB90 MOV EBP,6FB25085
XXXX:0043BB95 MOV EAX,[EBX+00000398] ;A1
XXXX:0043BB9B CALL 00430398 ;la case est-elle cochée ? (al=01=case cochée)
XXXX:0043BBA0 TEST AL,AL
XXXX:0043BBA2 JZ 0043BBC3 ;saut vers le test suivant
En fait le crackme parcourt toutes les cases et vérifie si elles sont cochées, si c'est le cas
alors les valeurs (EDI, ESI, EBP, DWORD PTR [ESP) subissent des modifications (opérations
arithmétiques, sar, ...), et à la fin, on teste de la façon suivante:
XXXX:0043C260 SUB EDI,[ESP]
XXXX:0043C263 ADD ESI,EDI
XXXX:0043C265 ADD EBP,ESI
XXXX:0043C267 CMP EBP,76651C4D
XXXX:0043C26D JNZ 0043C2D0 ;no jump = good cracker!
C'est assez original, je trouve. Encore une fois, la brute force va nous aider!
(heureusement les tests des cases sont effectuées dans l'ordre). Il y 39 cases, ça fait 2^39
possibilités (ça fait beaucoup). Toutes les séquences d'intructions qui suivent les tests des
cases se ressemblent à peu près toutes sauf trois: A4, C4 et C13.
Avec ma source en asm (j'espère qu'il n'y a pas d'erreurs dedans....), voilà la première bonne
combinaison que j'ai trouvée:
X X X O X O O O O X O O X
O O X X X O X O X X O X O
X X O X X O O O O O O O O
Remarque: Pour information j'ai essayé toutes les combinaisons de A1 à C7 (C8, C9, ..., C13 non
coché), il n'y a donc qu'une unique solution dans cet intervalle.
Greetings: All ID members (Volatility, Torn@do, ...), Eternal Bliss, ACiD BuRN, LaZaRuS, Duelist, ...
(c) Lucifer48. All rights reversed