Soluzione Communicate 1.0
From UIC
Soluzione Communicate 1.0(X-Treem)
Contents |
| Soluzione Communicate 1.0 | |
|---|---|
| Author: | Ixiodor |
| Email: | ixiodor gmail com |
| Website: | |
| Date: | 03/01/2011 (dd/mm/yyyy) |
| Level: |
|
| Language: | Italian |
| Comments: | Difficile crackme.Facili i concetti |
Introduzione
Vedremo come risolvere un crackme ritenuto da molte persone,anche molto competenti,quasi impossibile da risolvere. Non mi dilungherò moltissimo su com'è fatto il crackme,piuttosto mi dedico a come raggiungere la soluzione dopo una rapida sorvolata al funzionamento.
Requisiti
- Una discreta conoscenza di un qualche linguaggio di programmazione.
- Funzionamento del XOR.
- Tanta tanta tanta tanta pazienza e logica.(Molto più importante dei primi due punti).
Tools
URL del programma
Essay
Funzionamento Generale del programma
Rapida apertura,proviamo qualche combinazione...nulla da fare,nessun messaggio di errore a cui fare riferimento. Apriamo olly, carichiamo l'exe senza alcun problema,lo eseguiamo e sembra andare tranquillamente,nessuna protezione. Ricarichiamo steppando un po' con F8 e vediamoci un po' il codice. Salta agli occhi chiamate come “CreateProcessA”,”CreateNamedPipeA” ed annessi. Continuando lo step con F8 si va incontro ad un “Errore Inatteso”,quindi break subito dopo “ConnectNamedPipe”. Andando avanti nel programma ci troveremo alla “DialogBoxParamA” che poco ci interessa come funziona e quindi sarà inutile seguire la sua CALL, prendiamoci il parametro “DialogProc” corrispondente alla routine di gestione degli eventi del programma. Ci troveremo davanti ad uno switch che seleziona i vari eventi. A noi interessa quelli relativi al tasto “OK”. Senza perdere molto tempo,il programma ci permette di capire qual'è abbastanza facilmente(Quello con chiamate a “GetDlgItemTextA” ecc),brecchiamo quindi poco prima(Dopo il JNE di selezione eventi “CMP EAX,0BCD”). Proseguiamo l'esecuzione del programma,mettiamo qualche dato,premiamo “OK” e vediamo cosa accade. Prende l'user e compara la sua lunghezza con “0x0E” stessa cosa con la password,giungiamo alla prima conclusione: USER e PASS devono essere di 14 caratteri. Soddisfiamo le condizioni e continuiamo. Viene creata una stringa con questo formato “PASSWORD user password” ed inviata al PIPE successivamente legge una risposta dal PIPE(Successivamente analizzeremo cosa accade),successivamente fa una “CALL EAX” in cui c'è solo un “RET” e finisce qui,nulla da poter craccare, quindi andiamo ora a vede cosa succede in quel “WriteFile”(Invio dei dati alla PIPE). Brecchiamo sul “WriteFile” ed ora...finezza apriamo un'altra sessione di ollydbg e ci colleghiamo all'altro processo creato da questo crackme e brecchiamo tutte le “ReadFile”,eseguiamo il flusso principale(Olly1) arriveremo al “WriteFile” e premiamo F8,andiamo nel secondo olly(Olly2) e lo troveremo in pausing,F8 e seguiamo il flusso. Dopo un po' di istruzioni arriveremo a ciò che ci serve. Vediamo i punti:
- Prende l'user e password facendo un XOR su loro e salva il risultato. (Chiamiamolo XKey)
- Prende dei bytes(73 a 4030C5) ed inizia a fare un XOR di questi bytes con la nostra XKey,essendo la nostra KEY di 14 alla fine della sua lunghezza verrà ripetuta (Importante: XOR DALLA FINE ALL'INIZIO DI ENTRAMBE LE KEY,assolutamente non è identico al contrario)
- Di questo codice decrittato viene fatto un controllo con l'addizione,se la somma dei 73bytes è uguale a 0x180C vine considerato valido.(Viene considerato valido non significa che il codice sia decrittato correttamente).
Ok,qui si arriva alla tipica esclamazione : “OH CAZZO!” e per 4 anni nessuno è più riuscito ad andare avanti nel completamento,si è solo arrivati ad ipotesi senza nulla di concreto. Si iniziò a provare un bruteforce,ma il tempo era veramente insostenibile. Sono andato per vie logiche. Ha fatto tutti XOR allo stesso modo no? A XOR b = c XOR b = a. Quindi mi sono salvato i 73Bytes offuscati,mi sono scelto un user(“PassForIxiodor”) ed ho fatto XOR del mio user con il codice offuscato,quindi mi resta un codice offuscato da dover rendere chiaro solo con una password valida. Seguendo il mio user ritrovo questi 73Bytes :
Ora si aprono tantissime strade ed a me sono venute in mente queste:
- Supponiamo del codice:
- Jump ad altre zone dell'exe?(Scartiamo anche questa dopo un analisi dell'exe).
- Messagebox? (Questa la prendiamo in considerazione)
- Codice auto-modificante? (Per fortuna no! è solo una supposizione,ma scartiamo).
- Usiamo la logica(Ultima e valida spiaggia,mi è venuta molto tardi come idea).
Teoria della Messagebox
Sappiamo che per effettuare una chiamata alla MessageBox abbiamo bisogno di:

e poi del testo prima o dopo queste 6 istruzioni. Al RET dobbiamo specificare se si tratti di un “RET=C3” o “RET ??00 =C2 ??00” . Partiamo con le trasformazioni in OPCODE e ricaviamo:

Tra parentesi si può notare che alcuni valori li ho calcolati in base all'address corrispondete all'allocazione del codice decrittato(0x00403220) pertanto cambierà solo il 1° e per la CALL cosa analoga. La mia idea principale è stata di calcolare la KEY in modo logico usando questa composizione fissa slittando questi OPCODES dall'inizio alla fine del codice offuscato cercando i vari valori del XOR che mi rendessero le varie equazioni vere.(Es. Ho 6A,sul codice c'è 49.Qual'è quel valore che 6A XOR ?? mi dia 49? Vi fate una piccola APP che faccia ciò).Trovati 14Bytes di KEY anche se non completamente corretta,avreste trovato sicuramente qualcosa di buono che vi decritti almeno in modo parziale parte del testo che voi potrete facilmente riconoscere e successivamente procedere in modo banale.(Trovate C&$%rat$£a%ioni fate 2+2 e capite).Per la progettazione,per rendermi le cose più chiare,mi sono diviso il codice in pezzi da 14Bytes partendo dalla fine ricavando:

Rapida guardata e mi si è acceso un faro che mi ha fatto abbandonare la vecchia strada facendomi intraprendere quella della logica! Vi evidenzio cosa dovrebbe balzare all'occhio:

Le ripetizioni sulla stessa colonna equivalgono allo stesso BYTE e BYTE simili sulla stessa colonna corrispondono a caratteri consecutivi in tabella ASCII(Tradotto? Alfabeto). Iniziamo ad azzerare i Bytes sicuramente uguali in colonna(Sappiamo che ci dovrebbero essere abbastanza 0x00),avremo come KEY (00 dove non c'è certezza):
Il 19h finale è quasi certo e potrebbe significare:
- C2 ?? 00 (RET ??00)
- 00 (Fine stringa)
Abbiamo trovato quasi sicuramente il 1° carattere certo della KEY per il mio user permettendoci di decrittare già ben 5Bytes di codice con certezza. Applichiamo la KEY e vediamo cosa esce:
I più attenti noteranno qualcosa...i fine stringa e delle lettere...(r___l____n_) dopo gli 00 di fine stringa troveremo “___i”,”__p___t___”,”_l”,”___c___” Non so voi...ma a me sembra siamo sulla giusta strada. Facciamo delle deduzioni ed escluso che la parola sia “Contratulations” suppongo sia “Congratulazioni” (In questo caso si è stati fortunati,ma continuando così avremmo trovato ugualmente il resto delle lettere,lavorando per deduzione logica su Bytes simili in colonna e comparazione con codice che supponevamo,almeno i PUSH 0). Iniziamo dalla “r”. Questa “r” cade all'inizio del 4° rigo della suddivisione in 14°bytes. Quindi avremo “ratulazioni___”,forziamo il resto della KEY trovando i BYTES che XOR quel rigo ci dia “ratulazioni___”.Fatto ciò avremo:
Mancano ancora 2Bytes.Ma per ora utilizziamo questa KEY:
Resta qualche lettera da fixare ma se avete capito il procedimento ce la farete da soli spostandovi su di un altro rigo(Il 5° già va bene) e forzate i Bytes del “comple__to” trovandovi gli ultimi due Bytes. Ecco la soluzione ad un crackme restato irrisolto per 4 anni dopo aver fatto disperare ed arrendere grandi reverser.
Il Keygen
E' abbastanza banale da realizzare una volta avuto il codice in chiaro,passi:
- Prendere il codice Offuscato.
- Fare XOR con l'user inserito.(ricordate dalla fine all'inizio).
- Il risultante,XOR con il codice in chiaro.
- Prendere gli ultimi 14 Bytes del risultato.
- Questa è la KEY per quell'user.
Note Finali
Per la strada della MessageBox notate come se il blocco di codice fosse stato alla fine avremmo avuto vita più complicata(Non è un CALL indirizzo ma un CALL EAX,quindi eravamo poco distanti) ma essendo iniziale non avremmo avuto problemi(Di quel blocco di MessageBox non servono tutti gli OPCODES ma solo i primi 14 e ci saremmo esclusi il CALL ed il RET,quindi saremmo giunti ugualmente a conclusione).
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.