Corso UIC Newbies 06 Guancy
From UIC
Totally Newbies 6°
Contents |
| Infos | |
|---|---|
| Author: | Guancy |
| Email: | ilm_sat@yahoo.it |
| Website: | *** |
| Date: | 05/01/2007 (dd/mm/yyyy) |
| Level: |
|
| Language: | Italian |
| Comments: | Corso n° 6 per totali NewBies |
Introduction
This is lesson n° 6 of NewBies course.
We will find correct Registry keys to resolve tricks.
Tools
Link e Riferimenti
Questo è la soluzione del Corso UIC Newbies n°06 disponibile alla pagina Corso UIC Newbies 06
Essay
Risolvere questo corso mediante l'uso di OllyDbg (d'ora in poi Olly) è veramente molto semplice in quanto tale debugger (se installato con gli opportuni plug-in) è in grado di decodificare in real-time le API (permettendone una veloce lettura e comprensione).
Level 1
Carichiamo il programma nel debugger e poi clicchiamo su Search for-->All intermodular calls. Appariranno tutte le API richiamate dal programma ordinate per locazione di codice in cui sono memorizzate in memoria. Dal momento che dobbiamo trovare le corrette chiavi di registro direi che la cosa migliore da fare è settare un breakpoint sul primo RegOpenKeyExA. Ora avviamo il programma e clicchiamo su Controlla la chiave. Olly si fermerà in questo punto:
00401536 PUSH EAX//pHandle
00401537 PUSH 0F003F//|Access = KEY_ALL_ACCESS
0040153C PUSH 0//|Reserved = 0
0040153E PUSH 00404094//|Subkey = "AndreaGeddon"
00401543 MOV ESI,ECX//|
00401545 PUSH 80000001//|hKey = HKEY_CURRENT_USER
0040154A CALL DS:[<nowiki><</nowiki>&ADVAPI32.RegOpenKeyExA<nowiki>></nowiki>]//\RegOpenKeyExA
00401550 TEST EAX,EAX //controlla che la chiave sia presente
00401552 JE SHORT 00401575 //se presente OK altrimenti errore
[...]
Grazie ai commenti di Olly vediamo subito cosa viene richiesto: la chiave HKEY_CURRENT_USER\AndreaGeddon. Andiamo sul registro (start->esegui->regedit) e inseriamola. A questo punto clicchiamo nuovamente sul pulsante per effettuare il controllo e passiamo al livello seguente.
Level 2
Procediamo come al livello precedente ma settiamo questa volta un breakpoint su secondo RegOpenKeyExA. Clicchiamo su Controlla la chiave II e ci ritroveremo qui:
004015FE PUSH EAX///pHandle
004015FF PUSH 0F003F//|Access = KEY_ALL_ACCESS
00401604 PUSH 0//|Reserved = 0
00401606 PUSH 00404308//|Subkey = "AndreaGeddon\\1"
0040160B MOV EDI,ECX//|
0040160D PUSH 80000001//|hKey = HKEY_CURRENT_USER
00401612 CALL ESI//\RegOpenKeyExA
00401614 MOV EBX,DS:[<nowiki><</nowiki>&ADVAPI32.RegCloseKey<nowiki>></nowiki>]//ADVAPI32.RegCloseKey
0040161A TEST EAX,EAX//controlla che la chiave sia presente
0040161C JE SHORT 0040163D//se presente OK altrimenti errore
[...]
Vediamo che viene controllata l'esistenza della chiave HKEY_CURRENT_USER\AndreaGeddon\1; quindi creiamola e andiamo avanti. A questo punto vediamo che la sola chiave non è sufficiente in quanto una volta eseguito il JMP ci ritroviamo qui:
00401641 PUSH ECX///pHandle
00401642 PUSH 0F003F//|Access = KEY_ALL_ACCESS
00401647 PUSH 0//|Reserved = 0
00401649 PUSH 004042D4//|Subkey = "AndreaGeddon\\1\\2"
0040164E PUSH 80000001//|hKey = HKEY_CURRENT_USER
00401653 CALL ESI//\RegOpenKeyExA
00401655 TEST EAX,EAX//controlla che la chiave sia presente
00401657 JE SHORT 0040167F//se presente OK altrimenti errore
[...]
Qui viene controllata l'esistenza della chiave HKEY_CURRENT_USER\AndreaGeddon\1\2; inseriamola ed esguendo il JMP ci ritroveremo qui:
00401683 PUSH EDX
00401684 PUSH 0F003F
00401689 PUSH 0
0040168B PUSH 00404288//; ASCII "AndreaGeddon\\1\\2\\4"
00401690 PUSH 80000001
00401695 CALL ESI
00401697 TEST EAX,EAX
00401699 JE SHORT 004016B0
[...]
Che stress Andrea!!! :-) Ma quante sottochiavi hai fatto? Beh avete capito cosa bisogna fare qui: creare la chiave HKEY_CURRENT_USER\AndreaGeddon\1\2\4 e via al prossimo livello.
Level 3
Procediamo come ai livelli precedenti ma settando un breakpoint sul terzo RegOpenKeyExA ed arriviamo qui:
00401729 PUSH EAX// /pHandle
0040172A PUSH 0F003F// |Access = KEY_ALL_ACCESS
0040172F PUSH 0// |Reserved = 0
00401731 PUSH 004044E4// |Subkey = "AndreaGeddon\\WhatIsTheMatrix"
00401736 PUSH 80000001// |hKey = HKEY_CURRENT_USER
0040173B MOV BYTE PTR SS:[ESP+29],72// |
00401740 MOV BYTE PTR SS:[ESP+2B],6E// |
00401745 MOV BYTE PTR SS:[ESP+2D],74// |
0040174A CALL DS:[<nowiki><</nowiki>&ADVAPI32.RegOpenKeyExA<nowiki>></nowiki>] // \RegOpenKeyExA
[...]
La solita chiave da creare, questa volta si tratta di HKEY_CURRENT_USER\AndreaGeddon\WhatIsTheMatrix; creiamola, steppiamo sul JMP e arriviamo qui:
00401783 PUSH ECX// /pBufSize
00401784 PUSH EBX// |Buffer
00401785 PUSH 0// |pValueType = NULL
00401787 PUSH 0// |Reserved = NULL
00401789 PUSH 00404444// |ValueName = "WelcomeToTheRealWorld"
0040178E PUSH EDX// |hKey
0040178F CALL DS:[<nowiki><</nowiki>&ADVAPI32.RegQueryValueExA<nowiki>></nowiki>]// \RegQueryValueExA
00401795 TEST EAX,EAX //controlla che il valore sia presente
00401797 JE SHORT 004017AE//se presente OK altrimenti errore
[...]
Qui invece viene controllato che la chiave appena creata contenga un valore stringa di nome WelcomeToTheRealWorld quindi creiamolo e steppiamo sul JMP seguente arrivando qui:
004017AE PUSH EDI //handle valore stringa
004017AF XOR EDI,EDI
004017B1 MOV AL,DS:[EDI+EBX] //sposta in AL il contenuto del valore stringa
004017B4 MOV CL,SS:[ESP+EDI+18] //sposta in CL i bytes puntati da ESP+EDI+18
004017B8 CMP AL,CL //confrontali
004017BA JNZ SHORT 004017E9 //se non sono uguali errore
004017BC CMP EDI,7 //se EDI non e' 7 ...
004017BF JNZ SHORT 004017E1 //..allora salta alla routine che lo incrementa
[...]
A questo punto il codice è molto chiaro: viene controllato che il valore stringa creato precedentemente contenga una stringa di 7 char (poiché EDI viene confrontato con 7) presente all'indirizzo puntato da ESP+EDI+18. Per trovare tale stringa sarà necessario cliccare con il tasto destro su [ESP+EDI+18] e scefliere Follow in dump --> memory address. In questo modo nella parte bassa e sinistra del debugger apparirà il dump della memoria e troveremo la nostra bella stringa che è Trinityy. A questo punta inseriamola nel valore e passiamo all'ultimo livello.
Level 4
Procediamo come ai livelli precedenti però settando un breakpoint sul quarto RegOpenKeyExA e arriviamo qui:
00401842 PUSH EAX///pHandle
00401843 PUSH 0F003F//|Access = KEY_ALL_ACCESS
00401848 PUSH 0//|Reserved = 0
0040184A PUSH 00404674//|Subkey = "AndreaGeddon\\Sergej\\Rachmaninov"
0040184F PUSH 80000001//|hKey = HKEY_CURRENT_USER
00401854 CALL DS:[<nowiki><</nowiki>&ADVAPI32.RegOpenKeyExA<nowiki>></nowiki>]//\RegOpenKeyExA
0040185A TEST EAX,EAX //controlla che la chiave sia presente
0040185C JE SHORT 00401883 //se presente OK altrimenti errore
[...]
Oramai siamo esperti: creiamo la chiave HKEY_CURRENT_USER\AndreaGeddon\\Sergej\\Rachmaninov e saltiamo al JMP arrivando qui:
0040188B PUSH EDI///pHandle
0040188C PUSH ECX//pBufSize
0040188D PUSH ESI//|Buffer
0040188E PUSH 0//|pValueType = NULL
00401890 PUSH 0//|Reserved = NULL
00401892 PUSH 0040461C//|ValueName = "QualBuonVento"
00401897 PUSH EDX//|hKey
00401898 CALL DS:[<&ADVAPI32.RegQueryValueExA>>//\RegQueryValueExA
0040189E TEST EAX,EAX//controlla che il valore sia presente
004018A0 JE SHORT 004018B3//se presente OK altrimenti errore
[...]
Anche in questo caso siamo già eruditi: creiamo il valore stringa di nome QualBuonVento nella chiave precedente e saltando arriviamo qui:
4018B3 MOV EDI,ESI //sposta il contenuto del valore in EDI
4018B5 OR ECX,FFFFFFFF
4018B8 XOR EAX,EAX //azzera EAX
4018BA XOR EDX,EDX //azzera EDX
4018BC REPNE SCAS BYTE PTR ES:[EDI]
4018BE NOT ECX
4018C0 DEC ECX //in ECX c'é la lunghezza del contenuto del valore
4018C1 JE SHORT 004018DC //se è nulla errore
4018C3 MOV AL,DS:[EDX+ESI] //sposta il primo byte in AL
4018C6 MOV EDI,ESI //sposta ESI in EDI
4018C8 ADD AL,DL //somma DL (contatore posizione) ad AL
4018CA OR ECX,FFFFFFFF
4018CD MOV DS:[EDX+ESI],AL //sposta AL in EDX+ESI
4018D0 XOR EAX,EAX //azzera EAX
4018D2 INC EDX //incrementa EDX
4018D3 REPNE SCAS BYTE PTR ES:[EDI]
4018D5 NOT ECX
4018D7 DEC ECX
4018D8 CMP EDX,ECX //confronta a quale char è arrivato
4018DA JB SHORT 004018C3 //se ne mancano ancora rifai la routine
4018DC MOV EDI,ESI
4018DE OR ECX,FFFFFFFF
4018E1 XOR EAX,EAX
4018E3 XOR EDX,EDX
4018E5 REPNE SCAS BYTE PTR ES:[EDI]
4018E7 NOT ECX
4018E9 DEC ECX
4018EA JE SHORT 00401902
4018EC MOV AL,DS:[EDX+ESI]
4018EF MOV EDI,ESI
4018F1 ADD BL,AL //somma tutti i char modificati e salvali in bl
4018F3 OR ECX,FFFFFFFF
4018F6 XOR EAX,EAX
4018F8 INC EDX
4018F9 REPNE SCAS BYTE PTR ES:[EDI]
4018FB NOT ECX
4018FD DEC ECX
4018FE CMP EDX,ECX
401900 JB SHORT 004018EC
401902 CMP BL,0D1 //verifica che la somma dia D1
401905 JNZ SHORT 0040195A //se è corretta FINITO altrimenti ERRORE
[...]
Avete capito cosa fa questa routine? Prima di tutto somma ad ogni char del contenuto del valore stringa il numero della sua posizione ovvero al primo char somma 0 al secondo 1 al terzo 2 ecc. (N.B. la numerazione è come per i vettori in C e parte da 0). Una volta modificati i byte essi vengono sommati e se la somma dà come risultato D1 allora siamo a posto. Quindi ci sono varie possibilità una potrebbe essere: GU2 in quanto G=&47 U=&55 2=&32 e quindi modificando i byte otteniamo &47+&0 + &55+&1 + &32+&2 = &D1 ed abbiamo così risolto il corso.
Note Finali
Grazie alla U.I.C. di esistere.
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 malevoli 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.