pronti??? via!!! iniziamo questa 'caccia alla chiave' nel registro di windows...
lanciate il crackme in questione e andate a leggere le istruzioni proposte da
AndreaGeddon...fatto??? bene!!! allora possiamo partire con i primi due livelli seguendo
il consiglio sull'uso del solo RegMon...
lanciate regmon e restringete il suo range di azione sul solo crackme (per far ciò
basterà premere CTRL-L e inserire nel box include il nome del file che ci
interessa...cioè 'sesto'); in questo modo verranno monitorati soltanto gli accessi al
registro fatti dal nostro crackme...se proprio vogliamo fare i precisini premete CTRL-X
per pulire l'intero display.
ok... sembra tutto pronto per il livello 1!!!
LIVELLO 1
clickate sul tasto del livello 1 e vediamo che cosa succede (tenendo sempre d'occhio il
regmon); oplà...un bel messaggino di errore (non premere ok!!!) e un paio di righe
apparse nel display di regmon; vediamo di che cosa si tratta:
diamo un'occhiata alla prima delle due (la seconda non ci interessa...è infatti
riferita ad uno dei classici suoni di windows) e cerchiamo di capire il suo significato.
in parole povere è successa questa cosa:
il programma 'sesto' ha eseguito un'operazione di apertura 'OpenKey' della chiave
'HKCU\AndreaGeddon' con un esito negativo 'NOT FOUND'...perchè questo errore? semplice,
il nostro programma sta cercando una chiave che non esiste!!! come risolvere questo
problema??? proviamo a dargli questa benedetta chiave!
lanciate regedit...clicckate con il tasto destro del mouse sulla voce
'HKEY_CURRENT_USER' e seguite la sequenza Nuovo - Chiave. che nome daremo alla chiave???
'AndreaGeddon'... fatto??? okay, torniamo al nostro crackme (ora potete pure premere
sull'ok), clickate di nuovo sul tasto del livello 1 e vediamo se cambia qualcosa.
oplà...campioni der mondo!!!... il livello 1 è superato.
prima di passare al livello 2 torniamo a dare uno sguardo a ciò che è successo al
regmon. come potete vedere ci sono delle righe in più; diamo uno sguardo a queste due:
2 ... Sesto
CloseKey 0x63FBCC
BADKEY
5 ... Sesto
CloseKey HKCU\AndreaGeddon
SUCCESS
entrambe rappresentano l'operazione di chiusura di una chiave (le operazioni con le
chiavi seguono sempre questo ordine: apertura chiave - lettura e/o modifica - chiusura
chiave). notate la differenza tra le due righe...errore nel primo caso (il crackme cerca
di chiudere una chiave che non esiste!!!) e successo nel secondo (dopo il nostro
intervento!!!). bene!!! è arrivato il momento di continuare questa nostra caccia alla
chiave con il...
LIVELLO 2
continuiamo a fare i precisini dando la solita pulitina al display del regmon (CTRL-X) e
andate di corsa a premere il tasto del livello 2. oplà...errore...come prima diamo
un'occhiata al regmon.
hmmm...non sembra molto diverso rispetto al risultato ottenuto nel livello 1; e infatti
non lo è...anche qui cerca di aprire una chiave che non esiste...che fare quindi??? ormai
abbiamo capito il giochino e ripetiamo pari pari il lavoro fatto per il livello
precedente: create una nuova chiave, sottochiave di 'AndreaGeddon', con nome '1' e belli
contenti andate a premere il bottoncino...
ops!!! errore???...vediamo cosa ci dice il regmon:
hmmm...a quanto pare le operazioni nel registro sono in realtà due. la prima delle due,
contrassegnata dagli indici #0 (apertura) e #3 (chiusura), ha esito positivo (mi sembra
ovvio!!!) mentre è la seconda (#1 e #4) che ci crea delle noie. ma...stesso problema,
stessa soluzione. aprite regedit e create questa nuova chiave, sottochiave di '1',
chiamata '2'. bene...ci dovremmo essere...premete il fatidico bottoncino
e...#@§§°...stavolta cosa c'è che non va???
ancora un'altra!?! inserite anche questa nuova chiave '4' e che crom ce la mandi
buona...
wow...ancora campioni der mondo!!! livello 2 superato e ora...
LIVELLO 3
vi ricordate le istruzioni che cosa dicevano?: '...i primi due livelli possono essere
risolti anche senza l'uso di SoftIce...' pare proprio che questo livello non potrà essere
risolto con il solo aiuto del regmon. comunque sia, iniziamo; premete il bottoncino del
livello 3 e per curiosità diamo l'n-esima occhiata al regmon:
ahha...ci risiamo. regedit e aggiungete questa nuova chiave 'WhatIsTheMatrix'. premete
il bottoncino e ...errrore. quante chiavi dovremmo creare stavolta??? bah. regmon:
hmmm...c'è qualcosa di nuovo. fate bene attenzione alla riga #1. in questo nuovo
livello l'operazione tentata dal crackme non è l'apertura di una chiave ma bensì la sua
lettura, indicata da 'QueryValueEx'. da notare come accennato poca fa la sequenza apertura
chiave-lettura chiave-chiusura chiave.
e ora??? come si fa a creare un valore di una chiave??? andate su regedit, clickate col
tasto destro sulla chiave 'WhatIsTheMatrix' e seguite la sequenza Nuovo - Stringa; mettete
come nome 'WelcomeToTheRealWorld'. premete il bottoncino del livello 3 e ... ancora una
volta errore. purtroppo è arrivato il momento di abbandonare il regmon; stavolta infatti
non riusciamo ad ottenere informazioni aggiuntive...quindi...softice.
quello che dobbiamo fare adesso è trovare il valore ( "password" ) da dare
alla stringa 'WelcomeToTheRealWorld'; aprite regedit, clickate due volte su 'Welcome...' e
nel box valore mettete un valore fittizio a vostro piacere ( io ho messo 'cyber' ).
passiamo a softice e settiamo un bel breakpoint. hmmm...quale funzione scelgo??? la cosa
da fare in queste situazioni è quella di andare a vedere che funzioni usa il
programma...clickate con il tasto destro del mouse sul file 'sesto.exe' e scegliete la
voce 'anteprima'. normalmente quando si ha a che fare con il registro di windows le
funzioni che maggiormente ci interessano sono quelle con il prefisso 'Reg'... tra le varie
funzioni importate vedo 'RegQueryValueExA'...hmmm sembra proprio fare al caso nostro. (per
una descrizione dettagliata di questa e di tante altre funzioni scaricatevi e leggetevi il
file 'opcode.zip' presente nella pagina dei tools del sito della UIC)
benebenino...bpx RegQueryValueExA e via di corsa a premere il bottoncino del livello 3.
noppa! premete F12 e ci troviamo all'indirizzo :00401795. a questo punto cominciate a
steppare (F10) cercando di capire che cosa sta succedendo. ecco qui la parte di codice che
più ci interessa:
:00401783 push ecx
:00401784 push ebx
:00401785 push 00000000
:00401787 push 00000000
*
Possible StringData Ref from Data Obj ->"WelcomeToTheRealWorld"
:00401789 push 00404444
:0040178E push edx
*
Reference To: ADVAPI32.RegQueryValueExA, Ord:0136h
:0040178F Call dword
ptr [00405294]
:00401795 test eax, eax
:00401797 je 004017AE
:00401799 push 00000010
la call all'indirizzo 0040178F non è altro che la nostra RegQueryValueExA e le 6 push
che la precedono sono i 6 parametri che riceve in ingresso. se viene trovata una password
(nel mio caso 'cyber') saltiamo all'indirizzo 004017AE altrimenti errore.
:004017AE push edi
:004017AF xor edi, edi
Jump at Address:
|:004017E5
|
:004017B1 mov al, byte
ptr [edi+ebx]
:004017B4 mov cl, byte
ptr [esp+edi+18]
:004017B8 cmp al, cl
:004017BA jne 004017E9
:004017BC cmp edi,
00000007
:004017BF jne 004017E1
:004017C1 push 00000030
* Possible StringData Ref from Data Obj
->"System Failure"
|
:004017C3 push 004043C4
* Possible StringData Ref from Data Obj ->"Sei
l'eletto! (il campione der mondo!!!)"
ecco qua la parte fondamentale per la risoluzione di questo livello. vediamo un pò che
cosa abbiamo: un contatore , una 'cmp' tra due caratteri, un salto subito dopo...hmmm...
sembra proprio di essere di fronte ad un bel ciclo di confronto tra due stringhe! vediamo
però di non farci prendere dalla foga e procediamo con calma. subito dopo l'azzeramento
del nostro contatore (EDI) abbiamo due 'mov' molto interessanti. la prima mette in AL il
carattere puntato da EDI+EBX e la seconda mette in CL il carattere puntato da ESP+EDI+18.
provate con softice a vedere il contenuto di AL e CL ('? al' e '? cl' subito dopo
l'esecuzione delle due) e successivamente di EDI+EBX e ESP+EDI+18 ('d edi+ebx' e 'd
esp+edi+18'). otteniamo una cosa di questo tipo:
ci siamo!, abbiamo trovato la password richiesta: "Trinityy"... vediamo di
ricapitolare il tutto:
a) vengono prese due stringhe ('cyber' e Trinity') e confrontate carattere per carattere
b) se due caratteri risultano diversi si salta immediatamente ad un bel messaggio di
errore
c) altrimenti dopo 8 confronti (giusti) si salta ad un bel messaggo di congratulazioni!
pare proprio che il valore da dare alla stringa 'Welcome...' sia 'Trinityy'. ma è
proprio così??? in realtà no. rileggiamo insieme il punto c) scritto qua sopra.
hmmm...la password non è unica! infatti al nostro crackme bastano i primi 8 caratteri per
poter dire se si vince o si perde. quindi ho messo come password 'Trinityy bona' e ho
riprovato. Errore? perchè?...non mi sono perso d'animo, ho provato con una nuova
password: 'TrinityyX' e oplà, registrato. ci deve essere quindi un controllo sulla
lunghezza della password che mettiamo nel registro. ma chi è che può controllare la sua
lunghezza??? sicuramente la RegQueryValueExA con uso dei suoi parametri di ingresso.
torniamo quindi in softice, e mettete un bel breakpoint all'indirizzo 00401783. uscite e
premete il bottoncino del livello 3. noppa! cominciamo a vedere cosa effettivamente viene
pushato. il primo registro è ECX...quindi 'd ECX'. fate attenzione alla sequenza dei
caratteri che ottenete:
0A
00
00
00
54
72
69
6E
69
74
79
79
.
.
.
.
T
r
i
n
i
t
y
y
ok...abbiamo la password 'Trinityy' e poi? '0A', cosa sarà mai??? in decimale
rappresenta il numero 10...hmmm...non sarà mica il nostro limitatore di lunghezza?
provate ad inserire la password 'Trinityy bona' (ha lunghezza 13) e una volta sopra
l'istruzione all'indirizzo 00401783 modificate 0A in 0E (14 in decimale). per far ciò
scrivete 'e ECX' oppure clickate direttamente su 0A nella data window del sice e fate la
modifica. premete F5 e ...registrati.
per concludere..la password non è soltanto 'Trinityy' ma è una classe molto più ampia
del tipo 'Trinityy*' (* sta ad indicare un qualsiasi carattere).
LIVELLO 4
della 'serie a volte ritornano': regmon...apritelo (e settatelo a dovere) e premete il
bottoncino del livello 4.
hmmm un'altra password! come per il livello precedente vuole un valore. aggiungete il
valore con nome 'QualBuonVento' alla chiave 'Rachm....'. e dategli un valore fittizio (io
ho messo 'mahler'). vediamo di trovare questa nuova password. aprite softice, abilitate il
breakpoint sulla RegQueryValueExA e premete il solito bottoncino. noppa! F12 e cominciate
a steppare. ecco qui la parte di cdice che ci interessa:
*
Possible StringData Ref from Data Obj ->"QualBuonVento"
:00401892 push 0040461C
:00401897 push edx
*
Reference To: ADVAPI32.RegQueryValueExA, Ord:0136h
:00401898 Call dword ptr
[00405294]
:0040189E test eax, eax
:004018A0 je 004018B3
:004018A2 push 00000010
abbiamo la solita RegQ... e subito dopo una bella je. si salta all'indirizzo 004018B3 se
viene effettivamente trovata la password (nel mio caso 'mahler'); altrimenti errore.
:004018B3 mov edi, esi
:004018B5 or ecx,
FFFFFFFF
:004018B8 xor eax, eax
:004018BA xor edx, edx
:004018BC repnz
:004018BD scasb
:004018BE not ecx
:004018C0 dec ecx
:004018C1 je 004018DC
questa sequenza di istruzioni non fa altro che calcolare la lunghezza della password che
abbiamo inserito. la nostra password è memorizzata nel registro EDI e la sua lunghezza in
ECX. se ECX=0 si salta a errore altrimenti:
:004018C3 mov al, byte
ptr [edx+esi]
:004018C6 mov edi, esi
:004018C8 add al, dl
:004018CA or ecx,
FFFFFFFF
:004018CD mov byte ptr
[edx+esi], al
:004018D0 xor eax, eax
:004018D2 inc edx
:004018D3 repnz
:004018D4 scasb
:004018D5 not ecx
:004018D7 dec ecx
:004018D8 cmp edx, ecx
:004018DA jb 004018C3
eccoci di fronte ad un ciclo...ad ogni iterazione viene preso un carattere dalla
password (EDX+ESI punta alla password e il carattere viene messo in AL...indirizzo
004018C3) e viene poi sommato al contatore DL (al primo ciclo DL=0 e incrementa il suo
valore di una unità ad ogni iterazione...indirizzi 004018C8 e 004018D2). il ciclo viene
ripetuto fino a che non è stata scandita l'intera password. nel mio caso 'mahler' diventa
'mbjoiw':
'm'
-->
'm':
6Dh+00h=6Dh
'a'
-->
'b':
61h+01h=62h
'h'
-->
'j':
68h+02h=6Ah
'l'
-->
'o':
6Ch+03h=6Fh
'e'
-->
'i':
65h+04h=69h
'r'
-->
'w':
72h+05h=77h
okay??? bene...ma non è ancora finita. una volta che è stata scandita l'intera
password ci troviamo all'indirizzo 004018DC
:004018DC mov edi, esi
:004018DE or ecx, FFFFFFFF
:004018E1 xor eax, eax
:004018E3 xor edx, edx
:004018E5 repnz
:004018E6 scasb
:004018E7 not ecx
:004018E9 dec ecx
:004018EA je 00401902
viene calcolata la lunghezza della password modificata (che è la stessa della password
originale!!!). questa sequenza di istruzioni e identica alla sequenza compresa tra gli
indirizzi 004018B3 e 004018C1.
:004018EC mov al, byte
ptr [edx+esi]
:004018EF mov edi, esi
:004018F1 add bl, al
:004018F3 or ecx,
FFFFFFFF
:004018F6 xor eax, eax
:004018F8 inc edx
:004018F9 repnz
:004018FA scasb
:004018FB not ecx
:004018FD dec ecx
:004018FE cmp edx, ecx
:00401900 jb 004018EC
ecco un'altro bel ciclo...viene scandita la nuova password e vengono sommati tra loro
tutti i caratteri che la compongono. ad ogni iterazione il carattere corrente viene
memorizzato in AL (indirizzo 004018EC) e la somma parziale è memorizzata in BL (indirizzo
004018F1). si esce dal ciclo solo quando abbiamo scandito l'intera password. vediamo cosa
è successo nel mio caso:
* Possible StringData Ref
from Data Obj ->"Good work Mr. Cracker"
:00401909 push 004045BC
all'indirizzo 00401902 viene confrontata la somma calcolata poco fa con il valore D1h;
se i due valori sono diversi si salta a errore altrimenti siamo stati bravi e abbiamo
risolto l'intero crackme...
come facciamo ad ottenere questo D1h (in decimale è 209)??? prendiamo due caratteri la
cui somma sia D1h...scelgo ad esempio 'd' (64h = 100 in decimale) e 'm' (6dh = 109 in
decimale)...attenzione però! la nostra password non è 'dm' ma bensì 'dl' ('dm' si
ottiene dopo il ciclo in cui viene modificata la password!!!). inserite "dl"
e...abbiamo risolto l'intero crackme.
biebie
feLiX
Note finali
eccoci finalmente alla fine...pensavo fosse mooolto più semplice scrivere il mio primo
tute. spero tanto di non aver scritto grosse ç@...& e di essere stato il più chiaro
possibile. un salutone a tutti quanti in particolare a Quequero e a tutti i fondatori
della UIC...
Disclaimer
Vorrei ricordare che il software va comprato e non rubato, dovete registrare il
vostro prodotto dopo il periodo di valutazione. Non mi ritengo responsabile per eventuali
danni causati al vostro computer determinati dall'uso improprio di questo tutorial. Questo
documento è stato scritto per invogliare il consumatore a registrare legalmente i propri
programmi, e non a fargli fare uso dei tantissimi file crack presenti in rete, infatti
tale documento aiuta a comprendere lo sforzo immane che ogni singolo programmatore ha
dovuto portare avanti per fornire ai rispettivi consumatori i migliori prodotti possibili.
Noi reversiamo al solo scopo informativo e di miglioramento del linguaggio Assembly.