Corso UIC Newbies 06 Felix
From UIC
Corso UIC Newbies 06 Felix
Contents |
| Corso UIC Newbies 06 Felix | |
|---|---|
| Author: | Felix |
| Email: | |
| Website: | Home page |
| Date: | 29/09/2000 (dd/mm/yyyy) |
| Level: |
|
| Language: | Italian |
| Comments: | |
Tools
- Softice oppure OllyDbg v1.10
- Regmon
- RegEdit
Link e Riferimenti
Questo è il Corso UIC Newbies n°06 disponibile alla pagina Corsi UIC Newbies
Introduzione
Quattro livelli di difficoltà per raggiungere la meta finale...
Notizie sul Programma
Un classico 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!!!
1° livello
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 \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...
2° livello
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...
3° livello
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:
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.
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:
| Parola | . | . | . | . | T | r | i | n | i | t | y | y |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Esadecimale | 0A | 00 | 00 | 00 | 54 | 72 | 69 | 6E | 69 | 74 | 79 | 79 |
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 Trinityy1 (puoi aggiungere qualsiasi carattere).
4° livello
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:
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.
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:
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
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.
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...
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.
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
I documenti qui pubblicati sono da considerarsi pubblici e liberamente distribuibili, a patto che se ne citi la fonte di provenienza. Tutti i documenti presenti su queste pagine sono stati scritti esclusivamente a scopo di ricerca, nessuna di queste analisi è stata fatta per fini commerciali, o dietro alcun tipo di compenso. I documenti pubblicati presentano delle analisi puramente teoriche della struttura di un programma, in nessun caso il software è stato realmente disassemblato o modificato; ogni corrispondenza presente tra i documenti pubblicati e le istruzioni del software oggetto dell'analisi, è da ritenersi puramente casuale. Tutti i documenti vengono inviati in forma anonima ed automaticamente pubblicati, i diritti di tali opere appartengono esclusivamente al firmatario del documento (se presente), in nessun caso il gestore di questo sito, o del server su cui risiede, può essere ritenuto responsabile dei contenuti qui presenti, oltretutto il gestore del sito non è in grado di risalire all'identità del mittente dei documenti. Tutti i documenti ed i file di questo sito non presentano alcun tipo di garanzia, pertanto ne è sconsigliata a tutti la lettura o l'esecuzione, lo staff non si assume alcuna responsabilità per quanto riguarda l'uso improprio di tali documenti e/o file, è doveroso aggiungere che ogni riferimento a fatti cose o persone è da considerarsi PURAMENTE casuale. Tutti coloro che potrebbero ritenersi moralmente offesi dai contenuti di queste pagine, sono tenuti ad uscire immediatamente da questo sito.
Vogliamo inoltre ricordare che il Reverse Engineering è uno strumento tecnologico di grande potenza ed importanza, senza di esso non sarebbe possibile creare antivirus, scoprire funzioni malevole e non dichiarate all'interno di un programma di pubblico utilizzo. Non sarebbe possibile scoprire, in assenza di un sistema sicuro per il controllo dell'integrità, se il "tal" programma è realmente quello che l'utente ha scelto di installare ed eseguire, né sarebbe possibile continuare lo sviluppo di quei programmi (o l'utilizzo di quelle periferiche) ritenuti obsoleti e non più supportati dalle fonti ufficiali.