Zoom Icon

Soluzione secondo crackme di Zorks56

From UIC Archive

Seconda sfida da parte di Zorks56

Contents


Soluzione secondo crackme di Zorks56
Author: Walter1945
Email: [email protected]
Website: -
Date: 23/08/2011 (dd/mm/yyyy)
Level: Luck and skills are required
Language: Italian Flag Italian.gif
Comments: medio



Introduzione

Risolviamo il secondo crackme di Zorks56.



Tools & Files

  • hexeditor
  • debug ms-dos



URL o FTP del programma

  • CM98 alias Secondo Crackme by Zorks56


Essay

Troviamo la routine Protezione...

Avviamo il programma, la finestra richiede una password e per il momento inseriamone una a caso per vederne la reazione, il programma nell’attesa crea il file “CRACKME2.EXE”, e se la password inserita è sbagliata lo cancella è ci compare la scritta “Wrong!”.

Ora possiamo dargli un’occhiata al suo interno, rapidamente si trova la routine di decript sotto riportata:


01d7: sub di,01 jb 0202 mov al,es:[di] //legge il byte da decifrare mov ah,al sub al,bh mov bh,ah sub al,bl mov dh,al mov al,[bp+si] (ss:...) //legge il byte da noi inserito imul bl sub dh,al inc bl mov es:[di],dh add cl,dh adc ch,00 dec si jnz 01d7 mov dh,00 mov si,dx jmp 01d7

dove: di=8000 fa il conto a scalare cx=4F4 bl=00 contatore normale si=**** contiene la lunghezza della stringa inserita

Ragioniamo sul funzionamento...

Ragionando un po' sulla procedura, cerchiamo di immaginare come sarebbe la situazione al suo termine:


di=0 // il contatore si è azzerato al=6C // 6C è il valore dell ultimo byte cifrato ah=6C al-bh (bh=94) (al=6C-94)=D8 // 94 è il valore del penultimo bh=6C al-bl (bl=FF) (al=D8-FF=D9) // bl vale FF perche ogni ciclo si incrementa quindi 4FFF cicli.... dh=al =D9 al=x ax=al*bl (x*FF) // x è il carattere che dobbiamo trovare dh-al (4D=D9-al)-->>(al=D9-4D=8C) bl=0 risultato=dh="M"=4D // essendo un eseguibile terminerà con il solito "MZ"


Troviamo la giusta password...

Una volta capito il procedimento, si ha bisogno dei 7FFF byte cifrati per lavorarci sopra. quindi con il debug si steppa fino alla lettura,leggiamo i primi byte della memoria all'indirizzo es:0000,ovvero "6C 94 0E", dopo di che basta cercare lo stesso valore all'interno del crackme con un hexeditor e copiare tutti e 7FFF byte su un altro file che chiameremo "hex".


Immagine1.jpg


Ora dobbiamo trovare il valore "x" che ci permette di decifrare l'intera sequenza,prima avevamo giustamente ipotizzato che il primo carattere fosse una "M",ma non conoscendo gli altri valori la cosa potrebbe sembrare complicata, tuttavia è facile notare come all'interno della maggior parte dei programmi a 16 byte la parte iniziale sia formata in maggioranza da "00",proprio questi zeri vanificano la portanza della protezione.


Conoscendo i valori ora risulta semplice creare un piccolo script che esegua i calcoli (essendo pigro e non molto colto io l'ho fatto in QBASIC....perdonatemi):

risultato = 0 OPEN "C:\hex" FOR BINARY AS #1 temp$ = INPUT$(1, 1) bh = ASC(temp$)

FOR i = 1 TO LOF(1)

   al = bh
   temp$ = INPUT$(1, 1)
   bh = ASC(temp$)
   bl = (&HFF - i + 1) MOD 256
   IF bl < 0 THEN bl = bl + 256
   vari = (al - bh) MOD 256
   IF vari < 0 THEN vari = vari + 256
   vari2 = (vari - bl) MOD 256
   IF vari2 < 0 THEN vari2 = vari2 + 256
   FOR x = 0 TO 255
       conto = (x * bl) MOD 256
       IF conto < 0 THEN conto = conto + 256
       IF conto = (vari2 - risultato) AND ((x < 123 AND x > 96) OR (x < 58 AND x > 47)) THEN
           PRINT ,CHR$(x);
           SLEEP 10
       END IF
   NEXT x
   PRINT

NEXT i CLOSE #1


Purtroppo come già detto nella mia ignoranza non ho trovato una soluzione molto elegante per togliere il modulo negativo, tuttavia.... Ovviamente i primi risultati non saranno un granché perche i valori sono diversi dallo zero ipotizzato prima,comunque basta guardare poco più avanti:


Immagine2.jpg


Ottenuta la prima password possiamo decriptare il file “CRACKME2.EXE” e dato che il funzionamento è identico, procedendo analogamente si arriva a ottenere la seconda password “iperstaticoiperstaticoneme5999”, una volta inserita si otterrà il file “ZEUS.EXE” ovvero il Notepad.



Note Finali

Ringrazio tutti per avermi dato l'onore di scrivere per la prima volta un tute.



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.