Zoom Icon

Soluzione Crackme 14

From UIC Archive

Crackme n.14 : Solo un seriale ma... in VB5

Contents


Soluzione Crackme 14
Author: ValerioSoft
Email: ValerioSoft(AT)tin.it
Website:
Date: 23/02/2007 (dd/mm/yyyy)
Level: Half brain is enough
Language: Italian Flag Italian.gif
Comments: Proverbio Cinese : Chi, fin dalla nascita, non è protetto dagli dei, anche se cadrà all’indietro si romperà il naso.



Introduzione

Ciao ragazzi dato che questo è il mio secondo tutorial credo di non avere più bisogno di presentazioni :-D, anche perchè non so che scrivere!!!


Tools


Notizie sul CrackMe N.12

Questo è un CrackMe creato da KrAzY_N in Visual Basic 5, lo scopo è quello di beccare l'algoritmo di generazione del serial. ( o almeno credevo fosse così fino a che non l'ho risolto )


Essay

Bene Bene Bene...come appena anticipato questo CrackMe non è stato creato per essere patchato ed è proprio per questo motivo che lo facciamo ugualmente in modo tale da insegnare qualcosa a tutti e soprattutto a chi è alle prime armi.

...come prima cosa avviamo il CrackMe in modo tale da individuare qualche punto debole :

  1. Come primo tentativo premiamo direttamente il pulsante OK per vedere che reazione ha se non inseriamo nulla!!! Ci dice solamente (Scusa se è poco) che il codice di registrazione non è valido.
  2. Come secondo tentativo inseriamo un milione di lettere a casaccio e premiamo il pulsante OK, anche in questo caso ci avvisa solamente (ariscusa se è poco) che il codice di registrazione non è valido.

Segnamoci il messaggio di errore: Error / Invalid Registration Number.

Ora apriamo il nostro amato Ollydbg e mediante File->Apri carichiamo l'eseguibile del CrackMe. La prima cosa da fare è controllare se c'è qualche riferimento alle stringhe di testo che ci siamo segnati in precedenza.Quindi clicchiamo con il tasto destro del mouse sulla parte relativa al codice e poi scegliamo Search for -> All Referenced Text String.

BINGOOOOOOOOOOOOOOOO, proprio ciò che fa al caso nostro, ovvero:

  1. UNICODE "Thank You"
  2. UNICODE "Thank you for Registering!"
  3. UNICODE "Error"
  4. UNICODE "Invalid Registration Number!"

Questo è un buon punto di partenza per patchare il programma e come si può notare Ollydbg ci ha dato una mano raggruppando per noi tutte le stringhe UNICODE.

Proviamo ad utilizzare come punto di partenza "Thank you for Registering!" quindi clicchiamoci su con il tasto sinistro del mouse e poi premiamo Invio, ci porta dritti dritti alla locazione 004021C2. Io solitamente disassemblo il programma da crackare anche con Wdasm il quale mi permette di vedere quale punto del programma ci porta ad una determinata locazione. Infatti guardate il listato seguente :

... 004021A4 C74584441F4000 mov [ebp-7C], 00401F44 // UNICODE "Thank You"

...
Reference To: MSVBVM50.__vbaVarDup, Ord:0000h

                                 |

004021BD E80AEFFFFF Call 004010CC 004021C2 C74594081F4000 mov [ebp-6C], 00401F08 // UNICODE "Thank you for Registering!"


004021C9 EB39 jmp 00402204
...
004021DF C74584F81E4000 mov [ebp-7C], 00401EF8 // UNICODE "Error"

...

Reference To: MSVBVM50.__vbaVarDup, Ord:0000h

                                 |

004021F8 E8CFEEFFFF Call 004010CC 004021FD C74594B81E4000 mov [ebp-6C], 00401EB8 // UNICODE "Invalid Registration Number!"

Ovviamente io ho tagliuzzato qua e la un pò di codice dato che volevo mostrarvi lo schema del programma. Mi spiego meglio, partendo dal presupposto che solitamente è sempre un JUMP che ci porta verso una determinata porzione di codice, in base all'ordine in cui si trovano quelle istruzioni io mi chiedo "Se c'è prima Grazie e poi viene Errore che tipo di salto condizionato ci sarà????"

A rigor di logica prima della scritta UNICODE "Thank You" ci dovrebbe essere un salto condizionale che si attiva se inseriamo il serial errato e ci porta verso la messagebox di errore altrimenti non salta e ci mostra la messagebox di congratulazioni!!! Diamo quindi un'occhiata al disassemblato creato da W32dasm alla ricerca di un salto condizionale diretto verso la messagebox di errore:

Referenced by a (U)nconditional or (C)onditional Jump at Address: 0040218E(C) | 004021CB B904000280 mov ecx, 80020004 004021D0 894DA4 mov dword ptr [ebp-5C], ecx 004021D3 6A0A push 0000000A 004021D5 58 pop eax 004021D6 89459C mov dword ptr [ebp-64], eax 004021D9 894DB4 mov dword ptr [ebp-4C], ecx 004021DC 8945AC mov dword ptr [ebp-54], eax 004021DF C74584F81E4000 mov [ebp-7C], 00401EF8 // UNICODE "Error"

Avete notato cosa c'è scritto??? Referenced by...0040218E(C). Cosa significa??? Significa che si arriva alla riga 004021CB attraverso un salto condizionato che si trova alla riga 0040218E. Andiamo a vedere!!!

... 0040218B 6685FF test di, di 0040218E 743B je 004021CB // se salta va all'errore,

                                                                     // altrimenti.....

00402190 B904000280 mov ecx, 80020004 00402195 894DA4 mov dword ptr [ebp-5C], ecx 00402198 6A0A push 0000000A 0040219A 58 pop eax 0040219B 89459C mov dword ptr [ebp-64], eax 0040219E 894DB4 mov dword ptr [ebp-4C], ecx 004021A1 8945AC mov dword ptr [ebp-54], eax 004021A4 C74584441F4000 mov [ebp-7C], 00401F44 // UNICODE "Thank You"

L'istruzione je 004021CB significa che se avviene il salto ci porta verso la messagebox di errore quindi abbiamo trovato il punto debole del programma, potremmo pensare di noppare tutta la riga 0040218E ovvero inserire al posto di 743B tante coppie di 90 (9090). Vediamo come si patcha un programma:

Facciamo una copia dell'eseguibile (APP1.EXE) in modo tale da avere sempre una copia funzionante del programma e poi apriamolo con HIEW32.Sicuramente compaiono una serie di simboli strani ora premiamo F4 e scegliamo DECODE.Adesso premiamo F5 che serve a saltare da una determinata riga del programma e scriviamo l'indirizzo 40218E preceduto da un punto (.).Hiew32 ci porta alla locazione desiderata e non ci resta che premere F3 per modificare l'Opcode 743B sostituendolo con 9090. Il 90 rappresenta il NOP ovvero No Operation, quindi che cosa stiamo facendo??? Stiamo eliminando il Jump in modo tale che il programma non avvia mai la messageBox di errore ma sempre quella dei ringraziamenti.Dopo aver sostituito i valori non ci resta che premere F9 (Update) e F10 (Exit).Non ci resta che avviare l'eseguibile ed inserire un serial fasullo e come per magia ci ringrazia anche. ;-)

Il Serial Fishing

Apriamo il nostro file originale con Ollydbg e piazziamo un bel Breakpoint on execution alla riga 0040218B, ora avviamo il programma premendo il tasto Play ed inseriamo come serial: ValerioSoft e premiamo il pulsante OK. Beh come mai Ollydbg non prende il controllo del programma??? "Perchè non va inserita una stringa ma un numero, idiota!!!!" Così mi risponderebbe più di qualcuno :-D

Bene allora inseriamo il nostro serial numerico, a me piace molto 123456789 e infatti lo inserisco e premo il pulsante OK. Come pensavamo, Ollydbg ha preso il controllo dell'applicazione, questo vuol dire che ci troviamo sull'istruzione TEST DI,DI questa istruzione effettua un AND tra i due valori e setta il registro di FLAG sulla base del risultato ottenuto, se il risultato fosse 0 allora attiverebbe lo ZERO FLAG. Nel nostro caso il risultato è proprio zero e quindi all'istruzione seguente verrà effettuato il salto dato che JE (salta se è uguale) e JZ (salta se è zero) sono la stessa cosa.

Adesso la cosa da capire è chi aggiorna il registro EDI prima di effettuare il TEST e per questo dobbiamo piazzare un altro Breakpoint qualche istruzione più su ovvero alla riga 00402163 e steppare con F8, questo è il pezzo di codice che ci interessa:

Referenced by a (U)nconditional or (C)onditional Jump at Address: |00402150(C) | 00402163 FF75E0 push [ebp-20]

Reference To: MSVBVM50.__vbaR8Str, Ord:0000h

                                 |

00402166 E885EFFFFF Call 004010F0 0040216B DC1D28104000 fcomp qword ptr [00401028] // confronta il valore contenuto nel

                                                           // coprocessore (il nostro serial) con
                                                           // quello contenuto alla locazione
                                                           // 401028 e poi lo estrae dallo stack

00402171 DFE0 fstsw ax // memorizza la word di stato del

                                                           // coprocessore in ax (0 se non sono
                                                           // uguali e 4000 se lo sono)

00402173 9E sahf // memorizza il registro AH nel

                                                           // registro FLAGS

00402174 7503 jne 00402179 // salta se i numeri non sono uguali,

                                                           // altrimenti...

00402176 6A01 push 00000001 // carica nello stack la costante

                                                           // 00000001

00402178 5F pop edi // e la mette in EDI (ovvero

                                                           // inizializza EDI con 00000001),
                                                           // questo valore non viene più
                                                           // modificato fino all'istruzione
                                                           // 00402189

Si può intuire che la locazione da tenere sotto controllo è la 401028 la quale contiene il valore decimale 1438675, prima di andare alla ricerca dell'algoritmo che genera il serial ci conviene fare una prova ovvero inserire questo numero direttamente nel box di registrazione e vedere cosa accade!!! Che ne dite??? Come immaginavo non c'è nessun algoritmo che genera il seriale ma la password è una ed una sola!!! Che CA**ATA e io che perdo tempo dietro a queste cose :-( non sono un mostro però questo lo risolve anche mio nipote!!!


Note Finali

Tutto sommato questo CrackMe può essere di aiuto a chi è ancora alle prime armi quindi penso che pubblicarlo sia la cosa più giusta da fare!!! Spero di avere ancora la possibilità di scrivere qualcosa, allora Ciaoooooooooooooooooo alla proximaaaaaaaaa

ValerioSoft


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 malevole 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.