WINRAR 3.51 it : Operare sugli archivi bloccati

Data

by LUCIFUGE[2006]-IseduceWITHfear

 

25/03/2006

UIC's Home Page

Published by Quequero

Qui è la MACCHINA.

Dorme tranquilla eppure è vulnerabile.

Qui è la MACCHINA.

Con il suo respiro liquido/elettrico.

Eccellente tutorial anche questo, rinnovo i complimenti!

Potrebbe svegliarsi e cancellarci tutti.

Potrebbe svegliarsi e cadere come altri idoli per mani umane.

Qui è la MACCHINA.

Con il suo dolore/piacere.

....

 

....

Difficoltà

( )NewBies ( )Intermedio ( )Avanzato ( )Master

 

 

 

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 usati

URSoft W32Dasm Ver 8.93 + Bratalarm Patch 3.0 - final

UltraCompare Professional Version 3.10 (http://www.ultracompare.com/)

UltraEdit-32 Professional Text/HEX Editor Version 11.20b (http://www.idmcomp.com)

Lo stesso target ossia WinRAR

URL o FTP del programma

www.winrar.it

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) :

 

 

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  - E' 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  - E' 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 :

 

 

Lanciamo UltraCompare ed analizziamo le divergenze fra i due file :

 

 

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 :

 

 

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) :

 

 

 

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 :

 

 

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 :

 

 

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

* Possible Reference to String Resource ID=00711: "Impossibile modificare un archivio bloccato"

                                  |

:00402391 B8C7020000              mov eax, 000002C7

: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) :

 

                                                          

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 :

 

:0046A5FE 51                      push ecx

:0046A5FF 6A70                    push 00000070 * Possible Reference to String Resource ID=00112: "Tipo"

:0046A601 53                      push ebx

:0046A602 E8DBD40200              Call 00497AE2 * Reference To: USER32.SetDlgItemTextA, Ord:0000h

:0046A607 833D6C124C0000          cmp dword ptr [004C126C], 00000000

:0046A60E 7407                    je 0046A617   SALTA AD ASSENTE SE LA CONDIZIONE E’ “ZERO”

:0046A610 B891020000              mov eax, 00000291 * Possible Reference to String Resource ID=00657: "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.,.,.,.

 

Note finali

Ringrazio in ordine sparso tutti Voi e QUEQUERO.

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.

Disclaimer

Mi permetto di apportare modifiche al classico “avviso” previsto da Quequero, che troverete alla fine di queste mie virgolettato.

Questa premura non è dovuta ad un attacco di egocentrismo ma al desiderio di chiarire alcune cose.

 

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 le vite delle protezioni previste per il movimento.

Estrae la corona di carica ed infine adagia il cuore ancora pulsante in un contenitore adatto.

Procede con calma a smontare ogni sua 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.

E’ 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 una 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.,.,.,..

"Vorrei ricordare che il software va comprato e  non rubato, dovete registrare il vostro prodotto dopo il periodo di valutazione. Non mi ritengo responsabile per eventuali danni causati al vostro computer determinati dall'uso improprio di questo tutorial. Questo documento è stato scritto per invogliare il consumatore a registrare legalmente i propri programmi, e non a fargli fare uso dei tantissimi file crack presenti in rete, infatti tale documento aiuta a comprendere lo sforzo che ogni sviluppatore ha dovuto portare avanti per fornire ai rispettivi consumatori i migliori prodotti possibili.

Reversiamo al solo scopo informativo e per migliorare la nostra conoscenza del linguaggio Assembly."