Zoom Icon

Archivi RAR Protetti

From UIC

WINRAR 3.51 it: Operare sugli archivi bloccati

Contents


Infos
Author: Lucifuge.:.IseduceWITHfear
Email: .:.
Website: .:.
Date: 25/03/2006 (dd/mm/yyyy)
Level: Some skills are required
Language: Italian Image:Flag_Italian.gif
Comments:

Qui è la MACCHINA. Dorme tranquilla eppure è vulnerabile. Qui è la MACCHINA. Con il suo respiro liquido/elettrico. Potrebbe svegliarsi e cancellarci tutti. Potrebbe svegliarsi e cadere come altri idoli per mani umane. Qui è la MACCHINA. Con il suo dolore/piacere.


Que: Eccellente tutorial anche questo, rinnovo i complimenti!



.:.Introduzione

WinRAR è la versione per piattaforma Windows del gestore di archivi creato da Alexander Roshal. Attualmente è disponibile, in prova per quaranta giorni, la versione stabile 3.51 in italiano. Tra le molteplici funzioni offerte dal programma, oltre al celebrato algoritmo di compressione, per le finalità che qui interessano vi è quella di prevenire modifiche agli archivi creati mediante una apposita funzione di "blocco". In questo tutorial vedremo come sussista la possibilità di operare anche sugli archivi "bloccati" sfruttando una banale vulnerabilità offerta proprio dallo stesso programma.

NB. Per il tutorial utilizzeremo a scopo didattico la versione di prova del programma e non procederemo a modificarne il sistema di registrazione.


.:.Tools


.:.Essay

Come ricordato nell'introduzione, WinRAR permette di creare archivi ai quali, spuntando l'opzione "Blocca l'archivio", non è più consentito apportare modifiche.

La funzione è accessibile in vari modi ad es. all'interno dell'applicazione è possibile attivarla selezionando un archivio precedentemete creato

e premendo Alt+B. Questo è il pannello di WinRAR che si aprirà (in giallo è evidenziata la funzione) :

Image:Lucifuge_Winrar_01.jpg

1) Primo tentativo di operare su archivi bloccati.

Nel pacchetto di installazione si trova allegato un documento chiamato NoteTecniche.txt.

In esso è contenuta una serie di informazioni molto interessanti sul formato degli archivi RAR.

Per quel che ci interessa, veniamo a conoscenza che in ogni archivio è presente un insieme ben preciso di blocchi ordinati allo scopo di qualificare in modo esatto cosa esso sia e cosa contenga.

Ecco alcuni passi estratti dal documento :


Ogni blocco inizia con i seguenti campi:



HEAD_CRC 2 bytes CRC del blocco intero o parziale
HEAD_TYPE 1 byte Tipo di blocco
HEAD_FLAGS 2 bytes Blocco con indicatori
HEAD_SIZE 2 bytes Dimensione del blocco
ADD_SIZE 4 bytes Campo opzionale - dimensione del blocco aggiunto



Intestazione dell'archivio ( MAIN_HEAD )

----------------------------------------



HEAD_CRC CRC dei campi da HEAD_TYPE a RESERVED2
2 bytes



HEAD_TYPE Tipo di blocco: 0x73
1 byte



HEAD_FLAGS Bit indicatori:
2 bytes

0x0001 - Attributo di volume (archivio multi-volume)
0x0002 - È presente un commento dell'archivio.
RAR 3.x usa un blocco separato per il commento e
non imposta questo indicatore.
0x0004 - Attributo per archivio bloccato
0x0008 - Attributo di archiviazione solida
0x0010 - Nuovo schema d'assegnazione dei nomi ai volumi
('nome_volume.partN.rar')
0x0020 - Sono presenti le informazioni d'autenticità
RAR 3.x non imposta questo indicatore.
0x0040 - È presente l'informazione per il recupero dei
dati
0x0080 - L'intestazione del blocco è crittografata
0x0100 - Primo volume (impostato solo da RAR 3.00 e
seguenti)


gli altri bit in HEAD_FLAGS sono riservati per uso
interno.



HEAD_SIZE Dimensione totale dell'intestazione dell'archivio,
2 bytes compreso l'eventuale commento

Dunque, quando WinRAR procede a bloccare un archivio non fa altro che modificare 2 bytes nell'intestazione dei medesimi (HEAD_FLAGS), con il valore corrispondente all'Attributo "archivio bloccato".

Ora possiamo provare a creare due archivi, del medesimo contenuto, di prova [PROVA1.RAR e PROVA2.RAR] il secondo dei quali sarà "bloccato".

Verifichiamo con WinRAR la presenza del blocco nel secondo archivio creato :

Image:Lucifuge_Winrar_02.jpg

Lanciamo UltraCompare ed analizziamo le divergenze fra i due file :

Image:Lucifuge_Winrar_03.jpg

Così rispettivamente agli indirizzi 0x0007 e 0x000A sono state apportate da WinRAR delle modifiche all'intestazione dell'archivio.

I valori presenti nel file PROVA1.RAR erano rispettivamente CF90 per l'indirizzo 0x0007 e 00 per l'indirizzo 0x000A.

Mentre i valori del file PROVA2.RAR erano 1537 per l'indirizzo 0x0007 e 44 per l'indirizzo 0x000A.

Ora rinominiamo il file di installazione di WinRAR ossia WRar351it.exe come PROVA3.RAR ed utilizziamolo come bersaglio del nostro piccolo esercizio.

Clicchiamo sul file appena rinominato per aprirne il contenuto in WinRAR e verifichiamo le informazioni ivi contenute :

Image:Lucifuge_Winrar_04.jpg

Bene, tra le altre è presente il "Blocco archivio". Chiudiamo l'applicazione e riapriamo lo stesso file con UltraEdit-32. Si lo so che dall'intestazione si tratta di un file eseguibile, per la precisione un archivio auto-estraente che contiene al suo interno il file RAR, e precisamente all'indirizzo 0x00E400 troviamo l'intestazione a cui ci eravamo abituati (se il file di installazione in vostro possesso è diverso dal mio potete utilizzare la stringa Rar! come argomento di ricerca) :

Image:Lucifuge_Winrar_05.jpg

Procediamo alla sostituzione dei seguenti byte 984F con CF90 e 0C con 00. Salviamo il tutto e riapriamo l'archivio con WinRAR. Controlliamo le informazioni contenute nel file :

Image:Lucifuge_Winrar_06.jpg

Il "Blocco archivio" è sparito (purtroppo non vengono più riconosciuti i dati di autenticazione).

Ora possiamo procedere con un altro tentativo ad esempio creando un archivio bloccato di grosse dimensioni ed a modificare rispettivamente CF90 per l'indirizzo 0x0007 e 00 per l'indirizzo 0x000A, ed otterremo sempre come risultato un archivio sbloccato.

2) Secondo tentativo di operare su archivi bloccati.

Lanciamo WinRAR.EXE e proviamo ad aggiungere altri file all'archivio PROVA2.RAR.

Si aprirà la finestra diagnostica rilevando un preciso valore di errore nell'applicazione :

Image:Lucifuge_Winrar_07.jpg

Creiamo una copia del file WinRAR.EXE e rinominiamola STUDIO.EXE

Apriamo con il W32DASM il file Studio.EXE e cerchiamo la stringa corrispondente all'errore ossia "Impossibile modificare un archivio bloccato" :


00402383 80BB046E000000 cmp byte ptr [ebx+00006E04], 00
0040238A 7420 je 004023AC
0040238C F6C201 test dl, 01
0040238F 751B jne 004023AC
00402391 B8C7020000 mov eax, 000002C7 // "Impossibile modificare un
// archivio bloccato"
00402396 E84DF30000 call 004116E8
0040239B 50 push eax
0040239C 83C317 add ebx, 00000017
0040239F 53 push ebx
004023A0 E86B250400 call 00444910
004023A5 83C408 add esp, 00000008
004023A8 B001 mov al, 01
004023AA 5B pop ebx
004023AB C3 ret
004023AC 80BB026E000000 cmp byte ptr [ebx+00006E02], 00
004023B3 742E je 004023E3
004023B5 F6C202 test dl, 02
004023B8 7529 jne 004023E3
004023BA F6C204 test dl, 04
004023BD 7409 je 004023C8
004023BF 80BB066E000000 cmp byte ptr [ebx+00006E06], 00
004023C6 741B je 004023E3

Notiamo la presenza di un salto condizionato ed esattamente 751B ossia eseguirà il salto tutte le volte che la condizione (ossia il rapporto che lega dl a 01) sarà diversa da zero (ZF=0), mentre quando la condizione non sarà verificata allora genererà l'errore "archivio bloccato".


0040238C F6C201 test dl, 01
0040238F 751B jne 004023AC // ------------- SEGUIAMO IL SALTO -.
00402391 B8C7020000 mov eax, 000002C7 // "Impossibile modificare un |
// archivio bloccato" |
00402396 E84DF30000 call 004116E8 |
0040239B 50 push eax |
0040239C 83C317 add ebx, 00000017 |
0040239F 53 push ebx |
004023A0 E86B250400 call 00444910 |
004023A5 83C408 add esp, 00000008 |
004023A8 B001 mov al, 01 |
004023AA 5B pop ebx |
004023AB C3 ret |
004023AC 80BB026E000000 cmp byte ptr [ebx+00006E02], 00 // <-------------+
004023B3 742E je 004023E3
004023B5 F6C202 test dl, 02
004023B8 7529 jne 004023E3
004023BA F6C204 test dl, 04
004023BD 7409 je 004023C8
004023BF 80BB066E000000 cmp byte ptr [ebx+00006E06], 00
004023C6 741B je 004023E3

Possiamo procedere invertendo l'ordine dei fattori del test ossia invece di test dl,01 con test 01,dl.

Apriamo WinRAR.EXE con UltraEdit e premiamo Ctrl+G ed inseriamo l'indirizzo corrispondente alle istruzioni da modificare ossia

0x00198c (se non sapete ricavare l'indirizzo guardate in basso nella finestra di W32Dasm o di IDA) :

Image:Lucifuge_Winrar_08.jpg

E modifichiamo F6C201 con F601C2 ossia il nostro test invertito. Salviamo ed avviamo WinRAR.

Proviamo nuovamente ad operare con l'archivio PROVA2.RAR e constatiamo che è possibile aggiungere dei file all'archivio nonostante sia presente il "Blocco archivio". L'effetto è un po' bizzarro lo devo ammettere e come entrare dentro una casa con la porta chiusa….

Lo stesso risultato è raggiungibile modificando solo il salto condizionato 751B in un salto incondizionato ossia EB1B.

Infatti allo stesso modo potremo aggiungere od aggiornare un archivio bloccato.

Con questo metodo non possiamo però eliminare i file già presenti in un archivio "bloccato", questo perché vi è un altro controllo eseguito da WinRAR sulla intestazione del file che influenza il comportamento del tasto destro del mouse dove è presente la voce "elimina file/cartelle" ed i comandi presenti nel menu.

Riapriamo il file con W32Dasm è cerchiamo il punto dove viene effettuato il controllo sull'intestazione rammentando le informazioni contenute nel file NoteTecniche.txt.


004044BC 8BC3 mov eax, ebx
004044BE E8510B0000 call 00405014
004044C3 8BC3 mov eax, ebx
004044C5 E8C6020000 call 00404790
004044CA 80BB006E000000 cmp byte ptr [ebx+00006E00], 00
004044D1 7423 je 004044F6
004044D3 33D2 xor edx, edx
004044D5 8A9382460000 mov dl, byte ptr [ebx+00004682]
004044DB 6683E23F and dx, 003F
004044DF 668993DC460000 mov word ptr [ebx+000046DC], dx
004044E6 668B8B80460000 mov cx, word ptr [ebx+00004680]
004044ED 66898BDE460000 mov word ptr [ebx+000046DE], cx
004044F4 EB43 jmp 00404539
004044F6 668B83126E0000 mov ax, word ptr [ebx+00006E12] |:004044D1(C)
004044FD 663B83D4460000 cmp ax, word ptr [ebx+000046D4]
00404504 7433 je 00404539
00404506 B8AC020000 mov eax, 000002AC // <---- "L'intestazione dell'archivio è
// danneggiata"
0040450B E8D8D10000 call 004116E8
00404510 50 push eax
00404511 8D5317 lea edx, dword ptr [ebx+17]
00404514 52 push edx
00404515 E8F6030400 call 00444910
0040451A 83C408 add esp, 00000008
0040451D E8A6E30100 call 004228C8
00404522 807DBF00 cmp byte ptr [ebp-41], 00
00404526 7511 jne 00404539
00404528 33C0 xor eax, eax
0040452A 8B55C0 mov edx, dword ptr [ebp-40]
0040452D 64891500000000 mov dword ptr fs:[00000000], edx
00404534 E9CE010000 jmp 00404707
00404539 F683DC46000001 test byte ptr [ebx+000046DC], 01 // Test se "archivio
// multi-volume"
00404540 0F95C1 setne cl // imposta il byte se la condizione
// non è 0
00404543 83E101 and ecx, 00000001
00404546 888B026E0000 mov byte ptr [ebx+00006E02], cl
0040454C F683DC46000008 test byte ptr [ebx+000046DC], 08 // Test se "archivio solido"
00404553 0F95C0 setne al // Imposta il byte se la condizione non è 0
00404556 83E001 and eax, 00000001
00404559 8883016E0000 mov byte ptr [ebx+00006E01], al
0040455F F683DC46000002 test byte ptr [ebx+000046DC], 02 // Test se "archivio con
// commento"
00404566 0F95C2 setne dl // imposta il byte se la condizione
// non è 0
00404569 83E201 and edx, 00000001
0040456C 8893036E0000 mov byte ptr [ebx+00006E03], dl
00404572 F683DC46000004 test byte ptr [ebx+000046DC], 04 // Test se "archivio bloccato"
00404579 0F95C1 setne cl; // imposta il byte se la condizione
// non è 0
0040457C 83E101 and ecx, 00000001
0040457F 888B046E0000 mov byte ptr [ebx+00006E04], cl
00404585 83BBE846000000 cmp dword ptr [ebx+000046E8], 00000000; // Test se "primo volume"
0040458C 0F95C0 setne al; // imposta il byte se la condizione
// non è 0
0040458F 83E001 and eax, 00000001
00404592 8883056E0000 mov byte ptr [ebx+00006E05], al
00404598 F683DC46000040 test byte ptr [ebx+000046DC], 40 // Test se "informazioni per il
// recupero"
0040459F 0F95C2 setne dl // Imposta il byte se la condizione
// non è 0
004045A2 83E201 and edx, 00000001
004045A5 8893076E0000 mov byte ptr [ebx+00006E07], dl
004045AB F683DC46000080 test byte ptr [ebx+000046DC], 80; // Test se "file crittografato"
004045B2 0F95C1 setne cl // Imposta il byte se la condizione
// non è 0
004045B5 83E101 and ecx, 00000001
004045B8 888B086E0000 mov byte ptr [ebx+00006E08], cl
004045BE 80BBC446000000 cmp byte ptr [ebx+000046C4], 00
004045C5 740D je 004045D4
004045C7 80BB086E000000 cmp byte ptr [ebx+00006E08], 00
004045CE 0F8527010000 jne 004046FB

Per i nostri scopi sono interessanti le seguenti linee di codice


00404569 83E201 and edx, 00000001
0040456C 8893036E0000 mov byte ptr [ebx+00006E03], dl
00404572 F683DC46000004 test byte ptr [ebx+000046DC], 04 // ; Test se
// “archivio bloccato”
00404579 0F95C1 setne cl //; imposta il byte se la
// condizione non è 0

Possiamo procedere nel seguente modo  :


all'indirizzo 0x003b79 modifichiamo 0F95C1 in 909090

L'inconveniente di questo metodo consiste solo nel fatto che WinRAR non visualizzerà correttamente la presenza del "blocco archivio".

Saranno, infatti, falsate tutte le informazioni relative nell'apposito box.

Proviamo allora a cercare dove la stringa relativa venga caricata. La porzione di codice che ci interessa è la seguente :


0046A5FF 6A70 push 00000070 // "Tipo"
0046A601 53 push ebx
0046A602 E8DBD40200 Call 00497AE2 // USER32.SetDlgItemTextA
0046A607 833D6C124C0000 cmp dword ptr [004C126C], 00000000
0046A60E 7407 je 0046A617 // SALTA AD ASSENTE SE LA CONDIZIONE È "ZERO"
0046A610 B891020000 mov eax, 00000291 // "Presente"
0046A615 EB05 jmp 0046A61C

Modifichiamo cmp dword ptr [004C126C], 00000000 in cmp dword ptr [004C126C], 00000001

Per fare ciò andremo a modificare le premesse che determinano il salto al valore "Assente" (salta se la condizione è uguale a zero) ossia all'indirizzo 0x069c0d sostituiremo il valore 00 con 01.

Lanciamo WinRAR e proviamo ad operare su un archivio privo di blocco. Tutto funziona regolarmente.

Ripetiamo l'operazione con un archivio in cui il blocco è presente. Anche qui tutto funziona regolarmente.

Ora potremo aggiungere, aggiornare ed eliminare file o commenti da qualunque archivio "bloccato" senza che le informazioni sulla presenza della protezione vengano falsate.

,.,.,.,LUCIFUGE[2006]-IseduceWITHfear.,.,.,.

Image:Lucifuge_Logo.jpg


.:.Note Finali

Ringrazio in ordine sparso tutti Voi e QUEQUERO (ma quanta pazienza hai?). Ringrazio quel pozzo di superficialità che è la Libera Università Internazionale degli Studi Sociali Guido Carli. Ringrazio i Rhapsody, gli Angra, i Dreamtheater, i Depeche Mode, i Darkness, Giuseppe Verdi ed Antonio Vivaldi.



.:.Aprite i vostri occhi

Vi è una stretta assonanza tra l'antica pazienza dell'Orologiaio e quella tutta moderna del Reverser. Non mi si perdoni il paragone perché lo ritengo molto calzante. Entrambi lavorano su una materia prima ed entrambi spesso "sezionano" un'opera intellettuale altrui. Provate ad immaginarli. Li vedete. Osservate la cura dell'Orologiaio con in mano il suo pezzo d'alta manifattura. Squadra il quadrante con il monocolo in tutte le sue finiture ed osserva la qualità delle lancette… i dettagli su quadrante… ascolta il passo dell'orologio saggiando il ticchettio del suo cuore. Poi eccolo pronto all'opera di "disassemblaggio". Armato della sua chiave apre il fondello e rimuove i fermi che fissano il calibro alla cassa. Estrae la corona di carica ed infine adagia il cuore ancora pulsante in un contenitore adatto. Procede con calma a smontare ogni componente svitando con mano decisa e leggera ogni piccola vite. Alla fine del suo paziente lavoro, disteso su un piano privo di polvere, c'è un intero codice meccanico fatto di parti piccolissime… molle rotelle ponti ecc… Perché ? per passione innanzi tutto e anche per arte. L'Orologiaio svolge il suo compito per apprendere il funzionamento di un orologio e non fa differenze se si tratta di un movimento standard considerato dai più "unadjustable" o di una manifattura. Appreso il suo funzionamento potrà ripare il movimento danneggiato, procedere ad una sua revisione pulendo l'olio invecchiato ed aggiungendone di nuovo come potrà decidere di apportare modifiche al movimento stesso. Un movimento però che normalmente è un prodotto intellettuale di altri. È questo farà l'orologiaio tranquillamente nella sua bottega. Immaginate con me ? Quante volte è accaduto già ? Nel mondo orologiero è una consuetudine che una casa acquisti un movimento X e proceda ad una sostituzione dei suoi pezzi al decoro dei ponti od alla scheletratura ed esso diventi un nuovo prodotto intellettuale. La caratteristica unica dell'essere umano è il creare il nuovo dal nuovo e dal nuovo ancora. Per questo ci "evolviamo" perché anche un'idea vecchia ci sembra di colpo nuova grazie ad uno stimolo sorto dentro di noi. Il Reverser è come un Orologiaio nei termini in cui apre e studia un prodotto intellettuale altrui. Studia per passione, per imparare ed anche per apportare modifiche. Cerca nuovi stimoli. Quando si parla di orologi non è possibile ascoltare le impressioni dei semplici utenti. Perché persone che si limitano ad indossare semplicemente un orologio potranno discutere di estetica dell'orologio ma cosa comprenderanno? ... della differenza che passi tra un orologio che monta 35 rubini, di cui 25 realmente necessari a sovrastare l'attrito e ben 10 disposti solo per scena, ed un orologio che ne monta solo 25, ma tutti realmente necessari ? Solo appassionati di orologeria e tecnici potranno apprezzare una soluzione tecnica rispetto ad un'altra e così via. Dunque quando parliamo di reversing intendiamo programmatori od autodidatti (come me) che nell'analisi del codice altrui trovano uno stimolo non fine a se stesso. Studiano con passione, per imparare ed anche per apportare modifiche. Certo esiste la "pirateria" (o meglio ora esiste un tempo la faccenda dei corsari era tutta un'altra storia). Certo va combattuta ma è anche vero che se esistono ladri di auto non per questo tutti coloro che la mattina mettono le mani nel motore della propria vettura o della vettura altrui sono "i ladri"… così come se esistono coloro che fanno orologi falsi non è vietato agli orologiai aprire e smontare gli orologi altrui. Almeno questa è la visione del sottoscritto ,.,.,.,LUCIFUGE[2006]-IseduceWITHfear.,.,.,..


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