newbies: corso 6
(registro, chiavi & valori !!!)


25-09-2000

by "feLiX"

 

 

UIC's Home Page

Published by Quequero



Bravo felix, ti meriti un complimento per il tuo lavoro ottimamente svolto.

 
UIC's form
E-mail: felix.m@tin.it
UIC's form

Difficoltà

(X)NewBies ( )Intermedio ( )Avanzato ( )Master

 

proviamo a risolvere i quattro livelli del crackme proposto da AndreaGeddon per il 6° corso newbies...


newbies: corso 6
(registro, chiavi & valori !!!)
Written by feLiX

Introduzione

quattro livelli di difficoltà per raggiungere la meta finale...

Tools usati

- RegEdit       è fornito da windows!!! (qualsiasi altro editor di registro di windows andrà bene)
RegMon      programma per vedere gli accessi al registro di windows
SoftIce        qualunque versione

URL o FTP del programma

allegato al sesto corso newbies

Notizie sul programma 

CrackMe  

Essay

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:
 
0       ...       Sesto       OpenKey              HKCU\AndreaGeddon                                              NOTFOUND
1       ...       Sesto       QueryValueEx       0xC1892290\C:\Windows\Media\Chord.wav            NOTFOUND
 
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.
 
0       ...       Sesto       OpenKey              HKCU\AndreaGeddon\1                                          NOTFOUND
1       ...       Sesto       QueryValueEx       0xC187F0F0\C:\WINDOWS\media\chord.wav       NOTFOUND
2       ...       Sesto       CloseKey              0x63FBCC                                                              BADKEY
 
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:
 
0       ...       Sesto       OpenKey       HKCU\AndreaGeddon\1         SUCCESS
1       ...       Sesto       OpenKey       HKCU\AndreaGeddon\1\2      NOTFOUND
        ---
3       ...       Sesto       CloseKey       HKCU\AndreaGeddon\1         SUCCESS
4       ...       Sesto       CloseKey       0xC49B4AF0                          BADKEY
 
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???
ecco che cosa ci riserva il regmon:
 
0       ...       Sesto       OpenKey       HKCU\AndreaGeddon\1             SUCCESS
1       ...       Sesto       OpenKey       HKCU\AndreaGeddon\1\2          SUCCESS
2       ...       Sesto       OpenKey       HKCU\AndreaGeddon\1\2\4       NOTFOUND
 
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:
 
0       Sesto       OpenKey       HKCU\AndreaGeddon\WhatIsTheMatrix       NOTFOUND
 
ahha...ci risiamo. regedit e aggiungete questa nuova chiave 'WhatIsTheMatrix'. premete il bottoncino e ...errrore. quante chiavi dovremmo creare stavolta??? bah. regmon:
 
0       Sesto       OpenKey            HKCU\AndreaGeddon\WhatIsTheMatrix                                               SUCCESS
1       Sesto       QueryValueEx     HKCU\AndreaGeddon\WhatIsTheMatrix\WelcomeToTheRealWorld     NOTFOUND
           ---
3       Sesto       CloseKey            HKCU\AndreaGeddon\WhatIsTheMatrix                                               SUCCESS
 
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:
AL="c"       CL="T"       EDI+EBX="cyber"       ESP+EDI+18="Trinityy"
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.
 
0       Sesto       OpenKey       HKCU\AndreaGeddon\Sergej\Rachmaninov       NOTFOUND
 
ci risiamo!!! aggiungete queste due chiavi nella giusta posizione, premete il bottoncino e poi regmon.
 
1       Sesto       QueryValueEx       HKCU\AndreaGeddon\Sergej\Rachmaninov\QualBuonVento       NOTFOUND
 
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:
 
mbjoiw --> 88h :       6Dh+62h+6Ah+6Fh+69h+77h = 288h = 88h
 
eccoci finalmente all'ultima parte di codice...
 
:00401902       cmp bl, D1
:00401905       jne 0040195A
:00401907       push 00000030
     * 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.