Corso UIC Newbies 06 Sensos
From UIC
Corso UIC Newbies 06 Sensos
Contents |
| Infos | |
|---|---|
| Author: | Sensos |
| Email: | |
| Website: | Home page |
| Date: | 16/06/2001 (dd/mm/yyyy) |
| Level: |
|
| Language: | Italian |
| Comments: | |
Tools
- Softice oppure OllyDbg v1.10
- Regmon
- Regedit di Windows
- Calcolatrice di Windows
Link e Riferimenti
Questo è il Corso UIC Newbies n°06 disponibile alla pagina Corsi UIC Newbies
Introduzione
Ciao a tuzz! Provo a esporre la mia soluzione x questo sesto corso...
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.
- Controllo 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:
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:
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:
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!
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"
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
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.
Categories: Sensos | 2001