Tutorial cracking

posted by Viralex | 06-Oct-2007 21:56

Oggi mi sono imbattuto in un forum che spiega come craccare un programma. Visto che in questi giorni mi sono innamorato dell'assembly, ho deciso di provare a craccarlo da solo, senza guardare la soluzione. Ci sono riuscito!

Il programma in questione è MSN password recovery. link: msn-password-recovery.

Appena crackato, ero curioso di scoprire come era stato risolto nel post del forum e la soluzione era la stessa! Ve la illustrerò tra poco, non vi spaventate è veramente la più semplice immaginabile.
E' una tecnica che conoscevo già da tempo, è basilare ma non la avevo mai messa in pratica a causa della mia mancanza di conoscenza nel campo dell'assembly.
Per chi non sa nulla di asm il primo passo fondamentale è studiarsi la struttura del processore, dei registri, della memoria. Iniziate con il GAS (processori P86/32) e poi passate al fasm che è veramente ottimo! con fasm è possible fare eseguibili con gui di appena 1kB!

Torniamo al cracking:
I programmi che ho utilizzato sono OllyDBG 110 (debugger), W32Dasm ed HexWorkShop.

Il programma non craccato non dice la password dei relativi account di messenger ma solamente la sua lunghezza.
nel mio caso:

Account: viralex87@hotmail.com
Password contains xx characters

Lo scopo è bypassare il controllo di registrazione outputtando la password.
Aprite il programma con Olly ed andate a cercare l'istruzione in cui viene caricata la stringa 'contains' oppure qualsiasi altro testo presente nella textbox del programma non craccato.
Per fare questo clicchiamo col tasto destro sul listato assembly, e andiamo su "Search for -> All referenced text strings".

Ecco cosa troviamo:

0040243B |. 8BCF |MOV ECX,EDI
0040243D |. E8 5EF7FFFF |CALL MSN_Pass.00401BA0
00402442 |. 8B8424 5002000 |MOV EAX,DWORD PTR SS:[ESP+250]
00402449 |. 85C0 |TEST EAX,EAX ; --> breakpoint
0040244B |. 8BCF |MOV ECX,EDI
0040244D |. 74 11 |JE SHORT MSN_Pass.00402460
0040244F |. 68 14C64100 |PUSH MSN_Pass.0041C614 ; ASCII "Password: "
00402454 |. E8 D7F8FFFF |CALL MSN_Pass.00401D30
00402459 |. 8D4424 40 |LEA EAX,DWORD PTR SS:[ESP+40]
0040245D |. 50 |PUSH EAX
0040245E |. EB 3B |JMP SHORT MSN_Pass.0040249B
00402460 |> 68 00C64100 |PUSH MSN_Pass.0041C600 ; ASCII "Password contains "
00402465 |. E8 C6F8FFFF |CALL MSN_Pass.00401D30
0040246A |. 8D4424 40 |LEA EAX,DWORD PTR SS:[ESP+40]


Il programma effettua un salto poco prima dell'istruzione che mostra la password (0040244D). Una soluzione può essere sostituire il jump con un'altro jump, oppure riempire i byte con delle istruzioni 'nulle'. Il NOP fa proprio al caso nostro, il suo codice esadecimale è 90, ne mettiamo due visto che il je occupa due byte. Quindi dobbiamo solamente sostituire 90 90 al posto di 74 11.

A questo punto è possibile completare l'operazione con Olly ma è più semplice usare W32Dasm. Cercate l'istruzione incriminata, 0040244D con W32Dasm. (Prima ho usato Olly perchè è più comodo per certe cose)
Nella barra in basso viene scritto l'offset, ovvero la posizione dell'istruzione nel file. Dovrebbe essere 0000244F.
Aprite il programma da craccare con un qualsiasi editor Hex, io ho usato HexWorkShop e andate a cercare l'offset. Dovreste vedere i due byte 74 11 in corrispondenza dell'offset. Cambiateli con 90 90 e salvate il file.
Il programma è craccato!
ecco l'immagine finale:



Non ho rimosso la stringa che dice che il programam non è registrato, ma non mi interessa, se volete fate da voi come esercizio.

Registrate il programma dopo il periodo di valutazione. Questo tutorial è stato scritto per puro scopo didattico, non mi assumo alcuna responsabilità per l'uso improprio che se ne potrebbe fare.
Commentate in massa!

comment by Vincent | 14-Oct-2007 12:20


Sei un grande come sempre :D In teoria sapevo come fare...ora che sto imparando anche io l'asm... chissà...

A presto!

Vincent


comment by viralex | 14-Oct-2007 16:07


grazie vincent!
sto rispondendo da debian con epiphany :O


page 1 - 2 comments