Soluzione al 6° corso newbies
Registry sniffing

 

08/09/2000

by §ensõs

 

 

UIC's Home Page

Published by Quequero

Ogni problema nasce non con una, ma infinite soluzioni

Cerco di dare una soluzione completa passo - passo in modo che tutti, anche i meno esperti possano risolvere questa lezione...

Però queste cose le dovresti scrivere 6 cm più sotto, questa è la mia zona franca, il mio piccolo eden, la mia baita isolata, il mio ceppo virale sconosciuto, la mia gomma di scorta, la mia capanna dello zio Tom, la mia stanza nel convento di clausura, ma è sempre invaso da voi.....Arrrrr :)))

Non basta dire "ole'" per uccidere un toro...

UIC's form

 

E-mail: sensos@excite.com
IRC chan: #crack-it / #hackmaniaci su irc.azzurra.it

UIC's form

Difficoltà

(x)NewBies ( )Intermedio ( )Avanzato ( )Master

 

Ciao a tuzz! Provo a esporre la mia soluzione x questo sesto corso...


Soluzione al 6° corso newbies
Registry sniffing

Written by §ensõs

Tools usati

Tools usati: Soft-Ice, RegMon, Regedit (di windoze), Calcolatrice (di windoze), Carta, Penna... cervello! :)

Notizie sul programma 

Il programma e' suddiviso in 4 livelli a soluzione successiva, cioe' si accede ai successivo solo se si e' risolto il prededente; regole del gioco: no patch, soluzione dei primi due livelli senza Soft-ice.

Essay

LIVELLO 1: semplice chiave

Allora, l'interazione con il registro di windoze e' palese... quindi apro RegMon, imposto il filtro, e includo il processo 'sesto'. A questo punto posso lanciare il programma; RegMon monitorizza 11 interrogazioni al registro di windoze che dopo una prima occhiata non risultano interessanti.
Ø Cntrollo la chiave (premendo il pulsante); RegMon monitorizza una chiamata alla chiave 'HKCU\AndreaGeddon' con risultato NOTFOUND. n.b.: HKCU = HKEY_CURRENT_USER che e' una delle 6 chiavi principali di windoze. n.b.2: mi accorgo che questa interrogazione al registro riguarda una chiave (che potremmo definire una cartella del registro di configurazione) perche' nella terza colonna 'request' di RegMon appara la dicitura 'OpenKey'.
Ø SOLUZIONE: aggiungo la chiave richiesra; apro RegEdit (Start->Esegui... digito regedit<invio>) mi posiziono sulla chiave hkey_current_user clicco con il tasto desto scelgo Nuovo->Chiave digito 'AndreaGeddon'; Ricontrollo la chiave del livello uno... Ben fatto! Primo livello registrato!
 
Livello 2: un accorgimento in piu'
Anche per questo livello la procedura e' simile alla predente:
Ø controllo la chiave 2, controllo RegMon e vedo che ha monitorato una chiamata alla chiave 'HKCU\AndreaGeddon\1';
Ø SOLUZIONE: aggiungo la chiave (tasto destro su 'HKCU\AndreaGeddon' Nuovo->Chiave digito '1');
Ø controllo la chiave 2, controllo RegMon e vedo che ha monitorato una chiamata alla chiave 'HKCU\AndreaGeddon\1\2';
Ø SOLUZIONE: aggiungo la chiave (tasto destro su 'HKCU\AndreaGeddon\1' Nuovo->Chiave digito '2');
Ø controllo la chiave 2, controllo RegMon e vedo che ha monitorato una chiamata alla chiave 'HKCU\AndreaGeddon\1\2\4';
Ø SOLUZIONE: aggiungo la chiave (tasto destro su 'HKCU\AndreaGeddon\1\2' Nuovo->Chiave digito '4');
Ø controllo la chiave 2... Ce l'hai fatta!
 
Livello 3: cosa cerchi?
Clicco sul tasto 'Chiave e codice', monitorizzo RegMon e vedo una chiamata alla chiave non trovata 'HKCU\AndreaGeddon\WhatIsTheMatrix'; mi preoccupo di aggiungere, anke in questo caso la chiave con la solita procedura, tasto destro su 'HKCU\AndreaGeddon' Nuovo->Chiave digito 'WhatIsTheMatrix'. Eseguo di nuovo il controllo premendo 'Chiave Codice', ricontrollo la monitorizzazione di RegMon e vedo che questa volta la richiesta al registro non e' piu' una chiave ma un valore 'QueryValueEx' con percorso 'HKCU\AndreaGeddon\WhatIsTheMatrix\WelcomeToTheRealWorld' il cui risultato e' notfound.
Ø SOLUZIONE: aggiungo il valore cliccando con il tasto destro su 'HKCU\AndreaGeddon\WhatIsTheMatrix' selezionando Nuovo->Stringa digito 'WelcomeToTheRealWorld' <invio>; la variabile e' stata definita, ora inserisco un valore fittizio (dummy) per facilitarmi le cose: seleziono 'WelcomeToTheRealWorld' con il tasto destro e seleziono Modifica, poi digito ad esempio 'ciao'. N.b.: ho pensato di inserire un valore dummy perche' e' piu' facile riconoscerlo in memoria anziche' aver lasciato la stringa vuota, siccome probabilmente il programma effetuera' un controllo tra il valore contenuto in questa variabile e qualcosa d'altro... cosa? se lo sapessi sarei gia' passato al livello 4! ;)
Ø Controllo cliccando 'Chiave e codice', controllo ancora il RegMon e come mi aspettavo questa volta alla ricerca del valore 'HKCU\AndreaGeddon\WhatIsTheMatrix\WelcomeToTheRealWorld' il risultato e' SUCCESS... ma non e' finita... Ok, adesso e' ora di aprire il nostro amatissimo Ice!
Ø Ctrl-D (apro Ice) e setto un breakpoint sulla funzione di lettura dei valori nel registro di configurazione digitando 'bpx RegQueryValueExA' (n.b.: siate sicuri di aver aggiunto la 'ADVAPI32.DLL' nella lista dei file esportati da Soft-Ice) Ctrl-D (ritorno in Windoze) clicco su 'Chiave e codice'; a questo punto Ice dovrebbe poppare, premo F12 per tornare in Sesto.exe e mi trovo qui:
* Reference To: ADVAPI32.RegQueryValueExA, Ord:0136h
                                  |
:0040178F FF1594524000            Call dword ptr [00405294]
:00401795 85C0                    test eax, eax
:00401797 7415                    je 004017AE <-salta se ha trovato il vlore
:00401799 6A10                    push 00000010

* Possible StringData Ref from Data Obj ->"Mi spiace non sei l'eletto"
                                  |
:0040179B 6828444000              push 00404428
 * Possible StringData Ref from Data Obj ->"Posso solo indicarti la soglia"
                                  |
:004017A0 68D4434000              push 004043D4
:004017A5 8BCE                    mov ecx, esi

* Reference To: MFC42.MFC42:NoName0088, Ord:1080h
                                  |
:004017A7 E882040000              Call 00401C2E
:004017AC EB5D                    jmp 0040180B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401797(C)
|
:004017AE 57                      push edi <-arriviamo qui
:004017AF 33FF                    xor edi, edi <-azzera edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004017E5(C)
|
:004017B1 8A041F                  mov al, byte ptr [edi+ebx] <-valore trovato
:004017B4 8A4C3C18                mov cl, byte ptr [esp+edi+18] <-valore aspettato
:004017B8 3AC1                    cmp al, cl <-confronto dei valori
:004017BA 752D                    jne 004017E9 <-se coincidono continua
:004017BC 83FF07                  cmp edi, 00000007 <-ne hai confrontati 8 (il conteggio parte da 0!!) ?
:004017BF 7520                    jne 004017E1 <-NO salta, SI vai avanti

Ok, (disabilito i breakpoint con il comando 'bd *'); in 4017B1 il programma carica in AL il primo byte/carattere del valore contenuto nella variablie 'WelcomeToTheRealWorld', ricordate che avevamo inserito 'ciao'? Quindi in AL ci dovrebbe essere 63, che corrisconde al valore esadecimele del carattere 'c'; interessante visualizzare il contenuto della memoria nella locazione EDI+EBX con il comando 'd edi+ebi' che visualizzara, appunto, 'ciao'; nella riga successiva 4017B1 il programma carica in CL un valore, che nella riga 4017B8 viene confontato con il precedente.... ma cosa mai vorra' confrontare il programma? Il valore esatto per caso? Esatto!!! Ma guardiamo cosa contiene la locazione ESP+EDI+18 con il comando 'd esp+edi+18'... umh... 'Trinityy' che guarda caso e' proprio 8 caratteri!! (attenzione la riga 4017BC confonta EDI con 7 ma il conteggio e' partito da 0!!! 0-7 sono otto valori!!)

Ø SOLUZIONE modifico il valore della variabile 'WelcomeToTheRealWorld' in 'Trinityy'... Sei l'eletto! Hai sconfitto Matrix

 

Livello 4: poco piu' del 3

 Clicco su 'Chiave + codice + algo' e controllo il RegMon: leggo un a chiamata a una chiave 'HKCU\AndreaGedoon\Sergej\Rachmaninov' NOTFOUND..

Ø SOLUZIONE: aggiungo le due chiavi in successione, prima 'Sergej' dentro 'HKCU\AndreaGeddon' e poi 'Rachmaninov' dentro 'HKCU\AndreaGedoon\Sergej'

Ø Clicco su 'chiave + codice + algo' e monitorizzo RegMon; adesso c'e' una ricerca alla variabile 'HKCU\AndreaGedoon\Sergej\Rachmaninov\QualBuonVento' non trovata...

Ø SOLUZIONE: aggiungo la variabile e le assegno un valore dummy tipo 'ciao'

Ø Ok, e' ora di riattivare i breakpoint con il comando 'be *'... clicco su 'chiave + codice + algo', Ice dovrebbe poppare e dopo aver premuto F12 rieccomi dentro 'sesto.exe' in questo punto:

* Reference To: ADVAPI32.RegQueryValueExA, Ord:0136h
                                  |
:00401898 FF1594524000            Call dword ptr [00405294]
:0040189E 85C0                    test eax, eax
:004018A0 7411                    je 004018B3 <-salta se ha tovato il valore
:004018A2 6A10                    push 00000010

* Possible StringData Ref from Data Obj ->"E' l'ora del te?"
                                  |
:004018A4 6808464000              push 00404608

* Possible StringData Ref from Data Obj ->"Decisamente il quadro non "
                                  |
:004018A9 68D4454000              push 004045D4
:004018AE E9B3000000              jmp 00401966

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004018A0(C)
|
:004018B3 8BFE                    mov edi, esi <-eccoci qui
:004018B5 83C9FF                  or ecx, FFFFFFFF
:004018B8 33C0                    xor eax, eax
:004018BA 33D2                    xor edx, edx
:004018BC F2                      repnz
:004018BD AE                      scasb
:004018BE F7D1                    not ecx
:004018C0 49                      dec ecx<-ritorna la lunghezza della stringa inseria in 'QualBuonVento'
:004018C1 7419                    je 004018DC<-se e' 0 salta

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004018DA(C)
|
:004018C3 8A0432                  mov al, byte ptr [edx+esi]<-metti in AL un carattere della stringa: ESI punta all'inizio della stringa, EDI asume i valori da 0 alla lunghezza della stringa e fa da indice
:004018C6 8BFE                    mov edi, esi <-mette in EDI l'indirizzo della stringa
:004018C8 02C2                    add al, dl <-somma al valore del carattere quello del proprio indice
:004018CA 83C9FF                  or ecx, FFFFFFFF
:004018CD 880432                  mov byte ptr [edx+esi], al<-sovrascive in memoria il contenuto della stringa con il nuovo valore
:004018D0 33C0                    xor eax, eax <-azzera eax
:004018D2 42                      inc edx <-incremente l'indice
:004018D3 F2                      repnz
:004018D4 AE                      scasb
:004018D5 F7D1                    not ecx
:004018D7 49                      dec ecx <-ecx contiene la lunghezza della stringa
:004018D8 3BD1                    cmp edx, ecx<-confronta l'indice con la lunghezza della stringa
:004018DA 72E7                    jb 004018C3<-fin che e' minore salta

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004018C1(C)
|
:004018DC 8BFE                    mov edi, esi<-metti in edi l'indirizzo della stringa
:004018DE 83C9FF                  or ecx, FFFFFFFF
:004018E1 33C0                    xor eax, eax<-azzera eax
:004018E3 33D2                    xor edx, edx<-azzera edx
:004018E5 F2                      repnz
:004018E6 AE                      scasb
:004018E7 F7D1                    not ecx
:004018E9 49                      dec ecx<-ecx contiene il valore della lunghezza della stringa
:004018EA 7416                    je 00401902<-se e' nullo salta

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401900(C)
|
:004018EC 8A0432                  mov al, byte ptr [edx+esi]<-metti in AL un carattere della stringa: ESI contiene l'indirizzo dell'inizio della stringa, EDI fa da indice
:004018EF 8BFE                    mov edi, esi<-metti in edi l'indirizzo della stringa
:004018F1 02D8                    add bl, al<- BL = BL + AL cioe' volta per volta vengono sommati tutti i valori dei caratteri della stringa e salvati in BL
:004018F3 83C9FF                  or ecx, FFFFFFFF
:004018F6 33C0                    xor eax, eax<-azzera eax
:004018F8 42                      inc edx<-incrementa l'indice EDX
:004018F9 F2                      repnz
:004018FA AE                      scasb
:004018FB F7D1                    not ecx
:004018FD 49                      dec ecx<-ecx contiene la lunghezza della stringa
:004018FE 3BD1                    cmp edx, ecx<-confronta l'indice con la lunghezza della stringa (sono arrivato in fondo?)
:00401900 72EA                    jb 004018EC<- fin che e' minore salta

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004018EA(C)
|
:00401902 80FBD1                  cmp bl, D1<-confronta il valore ottenuto da tutte le somme con D1 (209 in decimale)
:00401905 7553                    jne 0040195A<- se e' diverso salta
:00401907 6A30                    push 00000030<-se e' giusto SEI UN BUON CRACKER!

* Possible StringData Ref from Data Obj ->"Good work Mr. Cracker"
                                  |
:00401909 68BC454000              push 004045BC

 

Figoli!!! Eccoci quasi in fondo! Allora, in due parole cosa fa questo codice? Prende la stringa contenuta nella variabile 'QualBuonVento' e tra la riga 4018C3 e la riga 4018DA ne codifica il valore sommando a ciascun valore dei caratteri quello del' indice della loro posizione cioe' es:

stringa:   c i a o (ascii = 63, 69, 61, 6f)
indice :   0 1 2 3 
ottengo:   c j c r (ascii = 63+0=63, 69+1=79, 61+2=63, 6f+3=72)

Poi tra la riga 4018EC e la riga 401900 questi valori vengono sommati tra loro, es:

sommo i valori di cjcr: 63+79+63+72=1b1
Questo valore viene salvato di volta in volta in BL che e' un registro a 8 bit, pertanto verra' salvata solo la parte meno significativa del risultato, nell'esempio BL=b1.
Per ultimo nella riga 401902, BL viene confrontato con D1. Se il valore coincide la lezione e' risolta.
Ø SOLUZIONE: ragioniamo al contratio: il valore finale che deve essere confrontato deve valere D1 che e' 209 in decimale. Quindi gia' con due caratteri posso raggiungere lo scopo es: 209=104+105 che corrispondono ai caratteri 'h' e 'i'; ricordando che nella prima parte della codifica ad ogni carattere viene sommato il proprio indice basta decrementare di 1 quello in posizione 1 e il gioco e' fatto! 105-1 = 104 che corrisponde al carattere 'h'. Quindi basta memorizzare come valore della stringa 'QualBuonVento' il valore 'hh'... Elementare Watson Ce l'hai fatta Ci vediamo al prossimo crackme
Ok, pero' noi siamo cracker professionisti... non falegnami dell'informatica!! Pertanto concludere il crackme registrando il quarto livello con una stringa 'hh' mi sembra poco bello!
Faccimao due conti in piu' in modo che risulti il mio nome! hi hi hi! Se la somma delle lettere del mio nome dovesse dare come 8 bit meno significativi proprio D1.... allora averi o ho un culo spudorato o AndreaGeddon voleva fare sto' crackme per me... umh... nessuno dei due, quindi predispongo un bel trattino dopo il mio nick consapevole che vada aggiunto un carattere per far tornare i conti:
stringa di partenza: § e n s õ s - (a7,65,6e,73,f5,73,2d)
indici             : 0 1 2 3 4 5 6
ottengo            : a7,66,70,76,f9,78,33
sommo              : 397
calolo il carattere
mancante che fa
tornare i conti    : 3d1-397 = 3a - 7 (tolgo l'indice) = 33 (51d = '3')
ole'               : §ensõs-3

Riporto anche il fiel .reg che risolve completamente il crackme... e' un riassunto!

------------------------taglia qui e nomina 'sens.reg'------------------
REGEDIT4
[HKEY_CURRENT_USER\AndreaGeddon]
[HKEY_CURRENT_USER\AndreaGeddon\1]
[HKEY_CURRENT_USER\AndreaGeddon\1\2]
[HKEY_CURRENT_USER\AndreaGeddon\1\2\4]
[HKEY_CURRENT_USER\AndreaGeddon\WhatIsTheMatrix]
"WelcomeToTheRealWorld"="Trinityy"
[HKEY_CURRENT_USER\AndreaGeddon\Sergej]
[HKEY_CURRENT_USER\AndreaGeddon\Sergej\Rachmaninov]
"QualBuonVento"="§ensõs-3"
--------------------------taglia qui--------------------------------------

 

                                                           by §ensõs ®2000
Note finali

Spero di non aver scritto cagate!!! Sono un NewBies, hi hi hi! E' da pochissimo che sono iscritto alla UIC e da poco che frequento anche i canali #hackmaniaci e #crack-it e devo ringraziare tutti x la loro infinita disponibilita' e gentilezza! Azz! Pensavo di trovare pesone ostili in canali cosi' specifici e un po' underground... invece ho capito che la cosa che rende queste persone cosi' speciali e' l'infinita sete di conoscenza, la voglia di migliorarsi continuamente e di confrontarsi in tutto quel che riguarda il magnifico modo dell'informatica. Ma cosa ci va a fare la gente in #chat-20?!! ;) ciauz!

Disclaimer

Tutto questo e' a scopo didattico... come al solito... x imparare qualcosa di piu'! ;)