Soluzioni del settimo corso NewBies

Sniffiamo il KeyFile

Data

by "ANO'S"

 

15/04/2005

UIC's Home Page

Published by Quequero

Microsoft...

Grazie tante Ano's :)

...Your Passion

Our Money...

 

 

 

Difficoltà

(*)NewBies ( )Intermedio ( )Avanzato ( )Master

 

Soluzioni del settimo corso NewBies

By ANO'S

Introduzione

Ho scritto questo tute perchè io uso WinXp e la mia SystemDirectory non è C:\WINDOWS\System ma C:\WINDOWS\System32
e il terzo livello non mi funzionava. Se usate WinXp dovete fixare Settimo.exe, sotto vi spiego come...
PS. L'address la chiamo riga

Tools usati

WinDasm per il codice nell' essay
Hiew per fixare settimo.exe
FileMon indispensabile o quasi se non usate SoftIce
OllyDebug mitico, poichè odio SoftIce (detto da un aspirante NewBies!! No scherzo ma olly è troppo figo)

URL o FTP del programma

Sul sito della [UIC] alla sezione "Lezioni"->"NewBies"

Essay

Prendete Hiew, aprite settimo.exe e andate con qualche [pag giù] alla riga 401973
 
sostituite
00401973: 0FBE95F1FDFFFF movsx edx,b,[ebp][0FFFFFDF1]
0040197A: 83FA5C cmp edx,05C ;"\"
0040197D: 7507 jne .000401986 -------- (4)
0040197F: C685F1FDFFFF00 mov b,[ebp][0FFFFFDF1],000 ;" "
con
00401973: 0FBE95F3FDFFFF movsx edx,b,[ebp][0FFFFFDF3]
0040197A: 83FA5C cmp edx,05C ;"\"
0040197D: 7507 jne .000401986 -------- (4)
0040197F: C685F3FDFFFF00 mov b,[ebp][0FFFFFDF3],000 ;" "
in pratica gli F1 con F3
 
Ora abbiamo il programma funzionante.
Eseguiamolo sotto monitoraggio con FileMon, e vediamo che non viene trovato il file KeyFile.And nella directory C:\... Creiamo il file, ora il prog non ci da più l'errore dell'apertura ma ci dice che il KeyFile.And è vuoto. Mettiamoci una chiave fittizia ->blablabla
Olly sotto mano si parte: diamo un occhiata su Intermodular Calls [R], bpx con F2 su CreateFileA, OpenFile, ReadFile così ci becchiamo tutto quello che fa il programma(lo so che è un metodo rozzo però funziona).
F9 e si parte:
Level One: appena premiamo su level one olly poppa su CreateFileA, e sotto vediamo
 
* Possible StringData Ref from Data Obj ->"C:\KeyFile.And"
:0040158D push 00404154
* Reference To: KERNEL32.CreateFileA, Ord:0031h
:00401592 Call dword ptr [004052AC] 
:00401598 mov dword ptr [ebp-3C], eax
:0040159B cmp dword ptr [ebp-3C], FFFFFFFF	<- verfica se esiste il file
:0040159F je 00401661 	<- Se non esiste salta a "Errore nell'apertura del keyfile"
:004015A5 push 00000000
:004015A7 mov eax, dword ptr [ebp-3C]
:004015AA push eax
* Reference To: KERNEL32.GetFileSize, Ord:00EDh
:004015AB Call dword ptr [004052A8]
:004015B1 mov dword ptr [ebp+FFFFFF54], eax
:004015B7 cmp dword ptr [ebp+FFFFFF54], FFFFFFFF <- verifica la grandezza del file
:004015BE je 0040164F <- se il file è di diversa grandezza salta a "Errore del filesize"
:004015C4 push 00000000
:004015C6 lea ecx, dword ptr [ebp+FFFFFF58]
:004015CC push ecx
:004015CD mov edx, dword ptr [ebp+FFFFFF54]
:004015D3 push edx
:004015D4 lea eax, dword ptr [ebp+FFFFFF60]
:004015DA push eax
:004015DB mov ecx, dword ptr [ebp-3C]
:004015DE push ecx
* Reference To: KERNEL32.ReadFile, Ord:01D6h
:004015DF Call dword ptr [004052A4]
:004015E5 test eax, eax <- vede se il keyfile è vuoto
:004015E7 je 0040163D <- se è vuoto salta ad un'altra beggar off
:004015E9 cmp dword ptr [ebp+FFFFFF58], 00000000 <- idem
:004015F0 je 0040163D <- idem
:004015F2 mov edx, dword ptr [ebp+FFFFFF58]
:004015F8 mov byte ptr [ebp+edx-000000A0], 00
:00401600 xor ecx, ecx <- veniamo al dunque
:00401602 lea esi, dword ptr [ebp+ecx-000000A0] <-punta in esi la stringa corretta
:00401609 lea edi, dword ptr [ebp+ecx-00000038] <-punta in edi "blablabla"
:00401610 mov ecx, 0000002B
:00401615 repz
:00401616 cmpsb <- conpara le lettere delle stringhe ad una ad una
:00401617 je 0040162B <- se le stringe sono identiche quindi il codice è giusto->"REGISTERED"
* Possible StringData Ref from Data Obj ->" Codice sbagliato"
:00401619 push 00404140
:0040161E lea ecx, dword ptr [ebp+FFFFFF5C]
* Reference To: MFC42.Ordinal:035C, Ord:035Ch
:00401624 Call 00401ED4
:00401629 jmp 0040163B
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
:00401617(C)
* Possible StringData Ref from Data Obj ->" - REGISTERED - "
:0040162B push 0040412C
:00401630 lea ecx, dword ptr [ebp+FFFFFF5C]
* Reference To: MFC42.Ordinal:035C, Ord:035Ch
:00401636 Call 00401ED4
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
:00401629(U)
:0040163B jmp 0040164D
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
:004015E7(C), :004015F0(C)
* Possible StringData Ref from Data Obj ->" KeyFile vuoto"
:0040163D push 0040411C
:00401642 lea ecx, dword ptr [ebp+FFFFFF5C]
* Reference To: MFC42.Ordinal:035C, Ord:035Ch
:00401648 Call 00401ED4
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
:0040163B(U)
:0040164D jmp 0040165F
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
:004015BE(C)
* Possible StringData Ref from Data Obj ->" Errore nel filesize"
:0040164F push 00404104
:00401654 lea ecx, dword ptr [ebp+FFFFFF5C]
* Reference To: MFC42.Ordinal:035C, Ord:035Ch
:0040165A Call 00401ED4
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
:0040164D(U)
:0040165F jmp 00401671
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
:0040159F(C)
* Possible StringData Ref from Data Obj ->" Errore nell'apertura del KeyFile"
:00401661 push 004040E0
:00401666 lea ecx, dword ptr [ebp+FFFFFF5C]

Alla riga 401615 avviene la comparazione tra edi ed esi. facciamo-> d esi e abbiamo trovato il codice corretto ovvero "LaFolliaGovernaIlVentoCheScendeDalleStelle"
Level One - REGISTERED -

Level Two
Usiamo il FileMon e vediamo dove va creato il filekey creiamo il file con la solita stringa fittizia. 

* Reference To: KERNEL32.ReadFile, Ord:01D6h
:004017BE Call dword ptr [004052A4]
:004017C4 test eax, eax
:004017C6 je 00401841
:004017C8 cmp dword ptr [ebp+FFFFFF74], 00000000
:004017CF je 00401841
:004017D1 mov eax, dword ptr [ebp+FFFFFF74] <- muove in eax la nostra stringa
:004017D7 mov byte ptr [ebp+eax-00000084], 00
:004017DF xor ecx, ecx
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
:004017FA(U) <-xorra la nostra stringa fittizia
:004017E1 xor eax, eax
:004017E3 mov al, byte ptr [ebp+ecx-00000084]
:004017EA cmp al, 00
:004017EC je 004017FC
:004017EE xor al, AA <- xorra con AA
:004017F0 mov byte ptr [ebp+ecx-00000084], al <- e la muove in [ebp+ecx-84]
:004017F7 inc ecx
:004017F8 xor eax, eax
:004017FA jmp 004017E1
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
:004017EC(C)
:004017FC mov byte ptr [ebp+ecx-00000084], 00
:00401804 xor ecx, ecx
:00401806 lea esi, dword ptr [ebp+ecx-00000084] <-punta in esi la nostra stringa xorrata
:0040180D lea edi, dword ptr [ebp+ecx-0000001C] <-punta in edi quella vera già xorrata
:00401814 mov ecx, 0000000F
:00401819 repz <-compara le due stringhe xorrate
:0040181A cmpsb
:0040181B je 0040182F <-se sono uguali vai a "REGISTERED"
* Possible StringData Ref from Data Obj ->" Codice sbagliato"
:0040181D push 00404140
:00401822 lea ecx, dword ptr [ebp+FFFFFF78]
* Reference To: MFC42.Ordinal:035C, Ord:035Ch
:00401828 Call 00401ED4
:0040182D jmp 0040183F
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
:0040181B(C)
* Possible StringData Ref from Data Obj ->" - REGISTERED - "
:0040182F push 0040412C
:00401834 lea ecx, dword ptr [ebp+FFFFFF78]
Facciamo quindi lo xoring inverso della stringa esatta con AA con la calcolatrice:
DF C3  C9 F8  FF E6 EF F0  CC C5 D8 CF DC CF D8     xor
AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA    =
75 69  63 52  55 4C 45 5A  66 6F  72 65  76 65 62
u   i    c   R    U   L   E  Z    f   o    r   e   v   e    r
Level Two - REGISTERED -
 
Level Three
Leggo le info quindi non uso FileMon. Esaminiamo il codice
* Possible StringData Ref from Data Obj ->"La mia mente controlla la mia realtà"
:0040191E mov esi, 004042E0
:00401923 lea edi, dword ptr [ebp-34]
:00401926 repz
:00401927 movsd
:00401928 movsb
:00401929 push 00000104
:0040192E lea eax, dword ptr [ebp+FFFFFEC8]
:00401934 push eax <- insomma muova la stringa esatta da esi in edi
* Reference To: KERNEL32.GetSystemDirectoryA, Ord:0131h <- vede qual'è la cartella di sistema
:00401935 Call dword ptr [004052B4]
:0040193B push 00000000
:0040193D lea ecx, dword ptr [ebp+FFFFFDD8]
:00401943 push ecx
* Possible StringData Ref from Data Obj ->"Avelletri.fra"
:00401944 push 004042D0
* Reference To: KERNEL32.OpenFile, Ord:01AFh
:00401949 Call dword ptr [004052B0]
:0040194F mov dword ptr [ebp+FFFFFEC4], eax
:00401955 cmp dword ptr [ebp+FFFFFEC4], FFFFFFFF
:0040195C jne 00401973
* Possible StringData Ref from Data Obj ->" Errore nell'apertura del keyfile"
:0040195E push 004042AC
:00401963 lea ecx, dword ptr [ebp+FFFFFDCC]
* Reference To: MFC42.Ordinal:035C, Ord:035Ch
:00401969 Call 00401ED4
:0040196E jmp 00401ACA
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
:0040195C(C)
:00401973 movsx edx, byte ptr [ebp+FFFFFDF3]<-muove [ebp-20D] ovvero \ in edx
:0040197A cmp edx, 0000005C <- e la compara con /
:0040197D jne 00401986 <- se non sono uguali salta e non muove 00 in [ebp-20D]
:0040197F mov byte ptr [ebp+FFFFFDF3], 00
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
:0040197D(C)
:00401986 lea eax, dword ptr [ebp+FFFFFEC8]
:0040198C push eax
:0040198D lea ecx, dword ptr [ebp+FFFFFDC4]
* Reference To: MFC42.Ordinal:0219, Ord:0219h
:00401993 Call 00401EDA
:00401998 mov dword ptr [ebp+FFFFFDB8], eax
:0040199E mov ecx, dword ptr [ebp+FFFFFDB8]
:004019A4 mov dword ptr [ebp+FFFFFDB4], ecx
:004019AA mov [ebp-04], 01
:004019AE mov edx, dword ptr [ebp+FFFFFDB4]
:004019B4 push edx
:004019B5 lea eax, dword ptr [ebp+FFFFFDE0]
:004019BB push eax
:004019BC lea ecx, dword ptr [ebp+FFFFFDC0]
* Reference To: MFC42.Ordinal:0219, Ord:0219h
:004019C2 Call 00401EDA
:004019C7 mov dword ptr [ebp+FFFFFDB0], eax
:004019CD mov ecx, dword ptr [ebp+FFFFFDB0]
:004019D3 mov dword ptr [ebp+FFFFFDAC], ecx
:004019D9 mov [ebp-04], 02
:004019DD mov edx, dword ptr [ebp+FFFFFDAC]
:004019E3 push edx
:004019E4 call 00401C50
:004019E9 mov byte ptr [ebp+FFFFFDC8], al
:004019EF mov [ebp-04], 01
:004019F3 lea ecx, dword ptr [ebp+FFFFFDC0]
* Reference To: MFC42.Ordinal:0320, Ord:0320h
:004019F9 Call 00401E9E
:004019FE mov [ebp-04], 00
:00401A02 lea ecx, dword ptr [ebp+FFFFFDC4]
* Reference To: MFC42.Ordinal:0320, Ord:0320h
:00401A08 Call 00401E9E
:00401A0D mov eax, dword ptr [ebp+FFFFFDC8]
:00401A13 and eax, 000000FF
:00401A18 test eax, eax <- se non hai mosso 00 in [ebp-20D] ->"te l'avevo detto..."
:00401A1A je 00401ABA -> sennò - REGISTERED -
:00401A20 push 00000000
:00401A22 mov ecx, dword ptr [ebp+FFFFFEC4]
:00401A28 push ecx
* Reference To: KERNEL32.GetFileSize, Ord:00EDh
:00401A29 Call dword ptr [004052A8]
:00401A2F mov dword ptr [ebp+FFFFFDD0], eax
:00401A35 push 00000000
:00401A37 lea edx, dword ptr [ebp+FFFFFDD4]
:00401A3D push edx
:00401A3E mov eax, dword ptr [ebp+FFFFFDD0]
:00401A44 push eax
:00401A45 lea ecx, dword ptr [ebp+FFFFFE60]
:00401A4B push ecx
:00401A4C mov edx, dword ptr [ebp+FFFFFEC4]
:00401A52 push edx
* Reference To: KERNEL32.ReadFile, Ord:01D6h
:00401A53 Call dword ptr [004052A4]
:00401A59 test eax, eax
:00401A5B je 00401AA8
:00401A5D mov eax, dword ptr [ebp+FFFFFDD4]
:00401A63 mov byte ptr [ebp+eax-000001A0], 00
:00401A6B xor ecx, ecx
:00401A6D lea esi, dword ptr [ebp+ecx-000001A0]
:00401A74 lea edi, dword ptr [ebp+ecx-00000034]
:00401A7B mov ecx, 00000024
:00401A80 repz
:00401A81 cmpsb
:00401A82 je 00401A96
* Possible StringData Ref from Data Obj ->" Codice sbagliato
:00401A84 push 00404140
:00401A89 lea ecx, dword ptr [ebp+FFFFFDCC]
* Possible StringData Ref from Data Obj ->" - REGISTERED - "
:00401A96 push 0040412C
:00401A9B lea ecx, dword ptr [ebp+FFFFFDCC]
* Possible StringData Ref from Data Obj ->"Te l'avevo detto di non fidarti del FileMon"
:00401ABA push 0040426C
:00401ABF lea ecx, dword ptr [ebp+FFFFFDCC]
Cascano subito all'occhio Avelletri.fra...sarà il keyfile? e "La mia mente controlla la mia realtà"...sara la stringa esatta?
Proviamo "te l'avevo detto di non fidarti del FileMon". Però vediamo anche una bella funzione: GetSystemDirectoryA. Tradotto in Italiano verrebbe Vedi qual'è la cartella di sistema. Nel mio caso C:\WINDOWS\System32\ perciò ho fatto la modifica. Mettiamo Avelletri.fra lì e...
Level Three - REGISTERED -
 
Level Four (Zero)
Il programma crea  da solo papero.que. Andiamo subito al dunque la nostra stringa viene comparata con 08311809 ovvero 137435145 in decimale.
 
* Reference To: MSVCIRT.?close@fstream@@QAEXXZ, Ord:00FEh
:00401BC9 Call dword ptr [00405448]
:00401BCF cmp dword ptr [esp+08], 08311809
:00401BD7 jne 00401BE0 <- se non sono uguali salta alla beggar off
* Possible StringData Ref from Data Obj ->" - REGISTERED - "
:00401BD9 push 0040412C
:00401BDE jmp 00401BE5

Level Four - REGISTERED -

DONE.

                                                                                                                 By ANO'S

Note finali

Grazie Que,AndreaG e tutta la [UIC] siete mitici! Ciao Al x i saluti sei sempre il primo della lista e soprattutto studia!(l'assembler ovviamente), un ultimo bafandohoculo a mia sorella che mi rompe i bip...

Disclaimer

Vorrei ricordare che il software va comprato e  non rubato, dovete registrare il vostro prodotto dopo il periodo di valutazione. Non mi ritengo responsabile per eventuali danni causati al vostro computer determinati dall'uso improprio di questo tutorial. Questo documento è stato scritto per invogliare il consumatore a registrare legalmente i propri programmi, e non a fargli fare uso dei tantissimi file crack presenti in rete, infatti tale documento aiuta a comprendere lo sforzo che ogni sviluppatore ha dovuto portare avanti per fornire ai rispettivi consumatori i migliori prodotti possibili.

PS Se volete fixare il settimo.exe dovete pagarmi (no scherzo, magari devo pagare io la [UIC])

Reversiamo al solo scopo informativo e per migliorare la nostra conoscenza del linguaggio Assembly.