Zoom Icon

Corso UIC Newbies 07 Guancy

From UIC

Totally Newbies 7°

Contents


Infos
Author: Guancy
Email: ilm_sat@yahoo.it
Website: ***
Date: 05/01/2007 (dd/mm/yyyy)
Level: Slightly hard
Language: Italian Image:Flag_Italian.gif
Comments:

Corso n° 7 per totali NewBies



Introduction

This is lesson n° 7 of NewBies course.
We will create correct KeyFiles to resolve lesson.


Tools

OllyDbg


Link e Riferimenti

Corso n° 7


Essay

Level 1

Carichiamo il programma in OllyDbg (d'ora in poi Olly) e clicchiamo con il tasto destro del mouse e scegliamo Search for --> All intermodular calls e mettiamo un breakpoint sul primo CreateFileA.
Avviamo il programma e clicchiamo su Level One e arriveremo qui:

[...]

0040157B PUSH 0//hTemplateFile = NULL
0040157D PUSH 80//|Attributes = NORMAL
00401582 PUSH 3//|Mode = OPEN_EXISTING
00401584 PUSH 0//|pSecurity = NULL
00401586 PUSH 0//|ShareMode = 0
00401588 PUSH 80000000//|Access = GENERIC_READ
0040158D PUSH 00404154//|FileName = "C:\\KeyFile.And"
00401592 CALL DS:[<nowiki><</nowiki>&KERNEL32.CreateFileA<nowiki>></nowiki>]//\CreateFileA
00401598 MOV [LOCAL.15],EAX //salva in una variabile il risultato dell'API
0040159B CMP [LOCAL.15],-1
0040159F JE 00401661 //se il file NON è presente salta a ERRORE
004015A5 PUSH 0//pFileSizeHigh = NULL
004015A7 MOV EAX,[LOCAL.15]//|
004015AA PUSH EAX//|hFile
004015AB CALL DS:[<&KERNEL32.GetFileSize>]//\GetFileSize
004015B1 MOV [LOCAL.43],EAX
004015B7 CMP [LOCAL.43],-1
004015BE JE 0040164F//se c'é un problema nella dimensione ERRORE
004015C4 PUSH 0//pOverlapped = NULL
004015C6 LEA ECX,[LOCAL.42]//|
004015CC PUSH ECX//|pBytesRead
004015CD MOV EDX,[LOCAL.43]//|
004015D3 PUSH EDX//|BytesToRead
004015D4 LEA EAX,[LOCAL.40]//|
004015DA PUSH EAX//|Buffer
004015DB MOV ECX,[LOCAL.15]//|
004015DE PUSH ECX //|hFile
004015DF CALL DS:[<nowiki><</nowiki>&KERNEL32.ReadFile<nowiki>></nowiki>]//\ReadFile
004015E5 TEST EAX,EAX //verifica
004015E7 JE SHORT 0040163D //se è vuoto ERRORE
004015E9 CMP [LOCAL.42],0
004015F0 JE SHORT 0040163D //se è vuoto ERRORE
004015F2 MOV EDX,[LOCAL.42]
004015F8 MOV BYTE PTR SS:[EBP+EDX-A0],0
00401600 XOR ECX,ECX
00401602 LEA ESI,SS:[EBP+ECX-A0] //carica in ESI indirizzo del CODICE presente nel KeyFile
00401609 LEA EDI,SS:[EBP+ECX-38] //carica in EDI indirizzo del CODICE del KeyFile
00401610 MOV ECX,2B
00401615 REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS:[EDI] //confronta chiavi
00401617 JE SHORT 0040162B //se la chiave è errata allora ERRORE altrimenti OK
00401619 PUSH 00404140// ASCII " Codice sbagliato"
0040161E LEA ECX,[LOCAL.41]
00401624 CALL <nowiki><</nowiki>JMP.&MFC42.#860<nowiki>></nowiki>
00401629 JMP SHORT 0040163B
0040162B PUSH 0040412C//ASCII " - REGISTERED - "
00401630 LEA ECX,[LOCAL.41]
00401636 CALL <nowiki><</nowiki>JMP.&MFC42.#860<nowiki>></nowiki>
0040163B JMP SHORT 0040164D
0040163D PUSH 0040411C//ASCII " KeyFile vuoto"
00401642 LEA ECX,[LOCAL.41]
00401648 CALL <nowiki><</nowiki>JMP.&MFC42.#860<nowiki>></nowiki>
0040164D JMP SHORT 0040165F
0040164F PUSH 00404104//ASCII " Errore nel filesize"
00401654 LEA ECX,[LOCAL.41]
0040165A CALL <nowiki><</nowiki>JMP.&MFC42.#860<nowiki>></nowiki>
0040165F JMP SHORT 00401671
00401661 PUSH 004040E0//ASCII " Errore nell'apertura del KeyFile"

[...]

Dal codice si evince che per superare questo livello è sufficiente creare il file C:\KeyFile.And al cui interno ci deve essere il codice presente all'indirizzo puntato da [EBP+ECX-38]. Per ottenere il codice è sufficiente cliccare con il tasto destro del mouse su [EBP+ECX-38] all'indirizzo 00401609.
Si trova che il codice da inserire è il testo LaFolliaGovernaIlVentoCheScendeDalleStelle.
Cliccando ora su Level One si otterrà la scritta REGISTERED.

Level 2

Procedendo come al livello precedente settiamo un breakpoint sul primo CreateFileA.
Clicchiamo su Level Two e arriviamo qui:

0040175A PUSH 0// /hTemplateFile = NULL
0040175C PUSH 80// |Attributes = NORMAL
00401761 PUSH 3// |Mode = OPEN_EXISTING
00401763 PUSH 0// |pSecurity = NULL
00401765 PUSH 0// |ShareMode = 0
00401767 PUSH 80000000// |Access = GENERIC_READ
0040176C PUSH 0040420C// |FileName = "C:\\Windows\\Andrewz.UIC"
00401771 CALL DS:[<nowiki><</nowiki>&KERNEL32.CreateFileA<nowiki>></nowiki>]// \CreateFileA
00401777 MOV [LOCAL.8],EAX
0040177A CMP [LOCAL.8],-1
0040177E JE 00401865// se il file non esiste ERRORE
00401784 PUSH 0// /pFileSizeHigh = NULL
00401786 MOV ECX,[LOCAL.8]// |
00401789 PUSH ECX// |hFile
0040178A CALL DS:[<nowiki><</nowiki>&KERNEL32.GetFileSize<nowiki>></nowiki>]// \GetFileSize
00401790 MOV [LOCAL.36],EAX
00401796 CMP [LOCAL.36],-1
0040179D JE 00401853
004017A3 PUSH 0// /pOverlapped = NULL
004017A5 LEA EDX,[LOCAL.35]// |
004017AB PUSH EDX// |pBytesRead
004017AC MOV EAX,[LOCAL.36]// |
004017B2 PUSH EAX// |BytesToRead
004017B3 LEA ECX,[LOCAL.33]// |
004017B9 PUSH ECX// |Buffer
004017BA MOV EDX,[LOCAL.8]// |
004017BD PUSH EDX// |hFile
004017BE CALL DS:[<nowiki><</nowiki>&KERNEL32.ReadFile<nowiki>></nowiki>]// \ReadFile
004017C4 TEST EAX,EAX
004017C6 JE SHORT 00401841
004017C8 CMP [LOCAL.35],0
004017CF JE SHORT 00401841// se e' vuoto ERRORE
004017D1 MOV EAX,[LOCAL.35]// carica lunghezza codice in EAX
004017D7 MOV BYTE PTR SS:[EBP+EAX-84],0
004017DF XOR ECX,ECX// azzera ECX
004017E1 XOR EAX,EAX// azzera EAX
004017E3 MOV AL,SS:[EBP+ECX-84]// sposta il char i-esimo in AL
004017EA CMP AL,0// confrontalo con 0
004017EC JE SHORT 004017FC// se e' uguale JMP
004017EE XOR AL,0AA// XORalo con AA
004017F0 MOV SS:[EBP+ECX-84],AL/ salvalo in una locazione di memoria
004017F7 INC ECX// incrementa indice i
004017F8 XOR EAX,EAX// azzera EAX
004017FA JMP SHORT 004017E1// JMP
004017FC MOV BYTE PTR SS:[EBP+ECX-84],0
00401804 XOR ECX,ECX
00401806 LEA ESI,SS:[EBP+ECX-84]// carica in ESI il codice lavorato
0040180D LEA EDI,SS:[EBP+ECX-1C]// carica in EDI il codice corretto
00401814 MOV ECX,0F// lunghezza del codice &F=15 char
00401819 REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]// confronta byte per byte
0040181B JE SHORT 0040182F// se tutti uguali REGISTRATO altrimenti ERRORE

Il codice è molto esauriente: il programma controlla che esista il file C:\Windows\Andrewz.UIC; vengono poi presi tutti i bytes salvati al suo interno e uno per uno vengono xorati con il valore &AA.
Per poter superare il livello è necessario che il risultato dello xor dia questi &F=15 byte: DF C3 C9 F8 FF E6 EF F0 CC C5 D8 CF DC CF D8.
Effetuando su questi byte lo XOR con &AA si ottengono i byte relativi alla stringa di char uicRULEZforever.
Sarà quindi sufficiente inserire tale stringa all'interno del file ed il livello sarà superato.

Level 3

Per risolvere questo livello iniziamo come ai livelli precedenti però settiamo un breakpoint sul primo OpenFileA ed arriviami qui:

[...]

401929 PUSH 104
40192E LEA EAX,[LOCAL.78]
401934 PUSH EAX
401935 CALL DS:[<nowiki><</nowiki>&KERNEL32.GetSystemDirectoryA<nowiki>></nowiki>] //chiamta all'API GetSystemDirectoryA
40193B PUSH 0
40193D LEA ECX,[LOCAL.138]
401943 PUSH ECX
401944 PUSH 004042D0 //nome file "Avelletri.fra"
401949 CALL DS:[<nowiki><</nowiki>&KERNEL32.OpenFile<nowiki>></nowiki>] //chiamta all'API OpenFile
40194F MOV [LOCAL.79],EAX
401955 CMP [LOCAL.79],-1
40195C JNZ SHORT 00401973 //se non ci sono errori JMP
40195E PUSH 004042AC //"Errore nell'aperutra del KeyFile"
401963 LEA ECX,[LOCAL.141]
401969 CALL <JMP.&MFC42.#860> //scrivi nel prog il mex precedente

[...]

Come si evince dal codice il keyfile richiesto si chiama Avelletri.fra. Il problema è il seguente: dove si deve salvare tale file? Per saperlo, dal momento che non viene dato un percorso (anche se prima c'é una sospetta chiamata all'API GetSystemDirectoryA che restituisce il percorso della cartella di sistema) è necessario dare un'occhiata al WIN32HLP, il quale ci dice che se in una chiamta all'API OpenFile non vine specificato il percorso del file esso viene cercato in:

1. cartella dalla quale viene caricata l'applicazione.
2. la directory corrente.
3. Windows95/NT: la cartella sistema di Windows (\system), NT (\system32) (viene usata la funzione GetSystemDirectory)
4. WindowsNT 16-bit version: cartella \system\
5. Cartella di Windows
6. Le directory che sono listate nella variabile PATH.

E' necessario quindi copiare il file in tutte queste directory:

C:\Windows\
C:\Windows\system\
C:\Windows\system32\ (solo per sistemi NT,XP,2000)
La directory da dove viene lanciato il programma
Le directory salvate nella directory temp


Bene, ora possiamo andare avanti e raggiungiamo questo punto del codice:

[...]

401A20 PUSH 0 //pFileSizeHigh=NULL
401A22 MOV ECX,SS:[EBP-13C]
401A28 PUSH ECX //hFile
401A29 CALL DS:[<nowiki><</nowiki>&KERNEL32.GetFileSize<nowiki>></nowiki>] //API GetFileSize
401A2F MOV SS:[EBP-230],EAX
401A35 PUSH 0 //pOverlapped=NULL
401A37 LEA EDX,SS:[EBP-22C]
401A3D PUSH EDX //pBytesRead
401A3E MOV EAX,SS:[EBP-230]
401A44 PUSH EAX //BytesToRead
401A45 LEA ECX,SS:[EBP-1A0]
401A4B PUSH ECX //Buffer
401A4C MOV EDX,SS:[EBP-13C]
401A52 PUSH EDX //hFile
401A53 CALL DS:[<nowiki><</nowiki>&KERNEL32.ReadFile<nowiki>></nowiki>] //ReadFile
401A59 TEST EAX,EAX //Controlla che non sia vuoto
401A5B JE SHORT 00401AA8 //se e' vuoto ERRORE
401A5D MOV EAX,SS:[EBP-22C]
401A63 MOV BYTE PTR SS:[EBP+EAX-1A0],0
401A6B XOR ECX,ECX
401A6D LEA ESI,SS:[EBP+ECX-1A0] //Testo presente all'interno del KeyFile
401A74 LEA EDI,SS:[EBP+ECX-34] //Testo richiesto dal KeyFile
401A7B MOV ECX,24 //Lunghezza del testo &24=36 char
401A80 REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] //Confronto tra le stringhe
401A82 JE SHORT 00401A96 //Se tutto è ok REGISTERED

[...]

Come si evince dal codice la routine controlla che nel file presente nella cartella ove è presente l'eseguibile venga inserito il testo "La mia mente controlla la mia realtà". Per scoprire tale testo è sufficiente procedere come al livello precedente ovvero arrivare all'indirizzo nel quale avviene il caricamento di tale stringa in memoria (00401A74) ed effettuare su SS:[EBP+ECX-34] un Follow in dump --> Memory address.
Perfetto, ora che è tutto chiaro...NEXT LEVEL!

Level 4

L'ultimo livello presenta una particolarità rispetto ai precedenti: in prima istanza viene creato dal programma un file di nome papero.que e poi viene controllato che, all'interno di tale file, ci sia il codice corretto. Quindi prima di effettuare il debug è necessario cliccare almeno una volta su Level Four in modo tale che il file venga creato e, una volta creato, inseriamo al suo interno il codice 666111666; in seguito settiamo un breakpoint su MSVCIRT.fstream::fstream e cliccando nuovamente sul pulsante arriviamo qui:

401B81 CALL DS:[<nowiki><</nowiki>&MSVCIRT.fstream::fstream<nowiki>></nowiki>] //MSVCIRT.fstream::fstream
401B87 LEA ECX,SS:[ESP+4]
401B8B MOV DWORD PTR SS:[ESP+78],0
401B93 CALL <nowiki><</nowiki>JMP.&MFC42.#540<nowiki>></nowiki> //API CString
401B98 MOV EAX,DS:[<nowiki><</nowiki>&MSVCIRT.filebuf::openprot<nowiki>></nowiki>] //sposta in EAX il puntatore al buffer
di lettura

401B9D MOV BYTE PTR SS:[ESP+78],1
401BA2 MOV ECX,DS:[EAX]
401BA4 PUSH ECX
401BA5 PUSH 1
401BA7 PUSH 004043D0 //File:="papero.que"
401BAC LEA ECX,SS:[ESP+18]
401BB0 CALL DS:[<nowiki><</nowiki>&MSVCIRT.fstream::open<nowiki>></nowiki>] //MSVCIRT.fstream::open
401BB6 LEA EDX,SS:[ESP+8]
401BBA LEA ECX,SS:[ESP+C]
401BBE PUSH EDX
401BBF CALL DS:[<nowiki><</nowiki>&MSVCIRT.istream::operator><nowiki>></nowiki>] //MSVCIRT.istream::operator DEC->HEX
401BC5 LEA ECX,SS:[ESP+C]
401BC9 CALL DS:[<nowiki><</nowiki>&MSVCIRT.fstream::close<nowiki>></nowiki>] //MSVCIRT.fstream::close
401BCF CMP DWORD PTR SS:[ESP+8],8311809 //Confronto tra il # inserito e &08311809
401BD7 JNZ SHORT 00401BE0 //Se diverso ERRORE

Vediamo un po' cosa fa il codice: una volta aperto il file (utilizzando le funzioni fstream) prende il suo contenuto numerico (testo inserito) e lo converte da decimale in esadecimale, dopodiche lo confronta con il numero &08311809 e se sono uguali il programma visualizzarà la fatidica scritta -REGISTRED-.
Quindi qual è il # corretto da inserire nel keyfile? Ma è molto semplice: sarà la conversione HEX-->DEC del #&08311809 ovvero il #137435145. Inseriamolo quindi nel keyfile ed avremo risolto anche l'ultimo livello.

--- GUANCY ---


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.