“Sono un invertito!”..ammise il file (proof of concept)

dicembre 29th, 2009

Nell’autunno del 2008 stavo lavorando con Nanni ad un game per il quale cercavo di ideare un sistema di data hiding.
L’idea che mi venne fu quella di lavorare sull’inversione del file, dove il termine del file diventasse l’inzio e viceversa.
L’inversione tuttavia non si sarebbe realizzata a livello di bytes, infatti se provassi ad usare tale sistema

ffd8 ffe1 78aa 4578 6966 0000 4d4d 002a  ....x.Exif..MM.*

otterrei al termine del file invertito

2a00 4d4d 0000 6669 7845 aa78 e1ff d8ff  *.MM..fixE.x....

ancor più banalmente

ffd8 ffe0 0010 4a46 4946 0001 0201 00c8  ......JFIF......

diventerebbe

c800 0102 0100 4649 464a 1000e0ff d8ff  ......FIFJ......

o ancora con un pdf

2550 4446 2d31 2e34 0a25 b5ed aefb 0a33  %PDF-1.4.%.....3

dove otterei

330a fbae edb5 250a 342e 322d 4644 5025  3.....%.4.1-FDP%

In tutti questi casi un operatore attento che si trovasse ad esaminare nel dettaglio un file di tipo sconosciuto potrebbe accorgersi del semplice giochetto in quanto, mantenendo il valore esadecimale dei bytes, ed invertendone semplicemente l’ordine, le stringhe presenterebbero ancora una buona leggibilità.
Con diverse tipologie di file, quelle che hanno sia header che footer, diventerebbe poi semplice, una volta compreso che il cattivo avesse utilizzato tale metodo, ricreare un file di configurazione ad-hoc per il carver, riuscendo così ad estrarre tutti i file trattati in tal modo.

L’idea era stata quindi di operare un inversione a livello di bit. In tal caso in una jpg

l’header 0xFFD8 = 1111111111011000 (binario)

diventerebbe il

footer  0001101111111111 (binario) = 0×1BFF

mentre il

footer 0xFFD9 = 1111111111011001 (binario)

diventerebbe

l’header 1001101111111111 (binario) = 0×9BFF

appare evidente che abituati a vedere

FFD8 .............. FFD9

potremmo avere seri problemi a riconoscere un

1BFF ............... 9BFF

Trovandoci davanti ad un file di tipo sconosciuto, che non presentasse al suo interno alcuna stringa riconsocibile in alcun modo, saremmo (probabilmente) facilmente indotti a pensare ad un qualche tipo di astrusa codifica. Passeremmo quindi al setaccio i media ed il sistema del sospetto alla ricerca del software di codifica utilizzato, di tracce della sua installazione. Mentre davanti a noi vi sarebbe semplicemente….

“su confessa! chi sei?? confessa!” urlò l’investigatore.

“ok, confesso…. sono un invertito!!”….ammise il file.

La proof of concept è rappresentata dallo script bit_reverse.sh, link a fondo pagina per il download. Se lo aprite con nano (gedit non ci riesce, mentre dovrebbero riuscirvi kate e kwrite) noterete la dicitura relativa al game per il quale era stato creato (poi non realizzatosi) e noterete che il codice in se costa di davvero poche righe.
Probabilmente chi la mattina mangia pane e bash può migliorarlo sensibilmente.
Al fondo del file è presente il set di valori esadecimali usato per la creazione del file “invertito”.
Lavorando a livello di bit il processo è piuttosto lento, provatelo quindi con un semplice file di testo contenente poche parole. Dopo avergli dato i diritti di esecuzione ed averlo lanciato ($ ./bit_reverse.sh) basterà indicargli il file da invertire. Il file generato sarà /tmp/output. Se a questo punto rieseguite lo script sul file ottenuto riotterrete l’originale.

Qualcuno penserà indubbiamente si tratti di un lavoro inutile, una perdita di tempo. Può essere, tuttavia va notato che:

L’evoluzione successiva di bit_reverse.sh, denominata great_bit_reverser.sh, implementa un sistema che consente di nascondere il file invertito all’interno di un’altro file (o supporto di memoria). In questo caso lo script, dopo aver invertito il file A, lo posizionava all’interno del file B, nel punto definito dall’utente, inserendo prima un header, facilmente modificabiledell’utente, seguito dalla dimensione del file.In tal modo rieseguendo great_bit_reverser.sh e scegliendo l’opzione per l’estrazione del file nascosto, si riottiene il file originale.

Tutto ciò rappresenta semplicemente una proof of concept, una prova di fattibilità [o se preferite, detto all'italiana, una "pippa mentale"].
Non lavoravo su questi script da oltre un anno, quindi non rammento esattamente il funzionamento di ogni riga di codice, che potrebbe non essere pefetto, anzi sicuramente non lo sarà. Quando abbandonai il progetto CFI, smettendo di lavorare al game autunnale, terminò anche lo sviluppo degli script, che tuttavia (a mio avviso) rappresentano uno spunto interessante di data hiding semplice semplice.
Chi volesse lavorarci dovrebbe riprenderli in mano concentrandosi sul numero di byte manipolati da dd e codificati nelle differenti basi tutti in una volta. I tempi bibblici di lavoro dipendono proprio da tale particolare, se volete provare gli script utilizzate quindi piccolissimi file.

Qui scaricate l’archivio contenente i due script (md5= 6145b8b44b5c18386b61bae13aeee4e8).

Come sempre  commenti, suggerimenti e consigli sono ben accetti.

Forensics, IT Sec & Hack, Linux, Tools | Comments | Trackback

9 Responses to ““Sono un invertito!”..ammise il file (proof of concept)”

  1. 1titticimmino
    dicembre 30th, 2009 @ 22:19

    a dire il vero, sarà che ho visto “con la mene del principiante”, immediatamente ho pensato a un’inversione di bit. a questo punto la cosa potrebbe continuare nel nascondere il file invertito in un altro pure invertito..

    poi dicono che l’algebra non serve!

    buon lavoro :)

  2. 2admin
    dicembre 31st, 2009 @ 00:14

    (con questa http://www.pubblicitaitalia.it/Allegati/1444.JPG faccia)

    ..sagace questa ragazza!….

    :-)

  3. 3titticimmino
    dicembre 31st, 2009 @ 02:34

    la matematica è la mia croce e la mia delizia :P

    e quella sarei io… invertita ??? :D :D :D :D

    mmm se mi ci metto, e chiedendo lumi a Riemann .. ah se la sua ipotesi viene dimostrata!!! Vi voglio vedere!
    ah Buon anno 2010!

  4. 4Nanni Bassetti
    dicembre 31st, 2009 @ 09:37

    quella faccia si riferiva alla battuta “sagace”, che diceva Bisio nello spot di PagineGialle…ecco che significa non guardare la TV :-)

  5. 5titticimmino
    gennaio 2nd, 2010 @ 14:58

    :O evvabbè Nanni nessuno è perfetto!
    :D

  6. 6Nanni Bassetti
    gennaio 2nd, 2010 @ 21:49

    Per punizione dovrai guardare 10 puntate del Grande Fratello ahahahahah :-D

  7. 7titticimmino
    gennaio 3rd, 2010 @ 15:25

    10 ?( bel numero binario ) pensavo di più! :D

  8. 8Data hiding: inversione di byte o bit – Gianni Amato
    gennaio 3rd, 2010 @ 16:32

    [...] il post di Denis mi è venuto in mente di riprendere lo script che pubblicai tempo fa su CFI ML e metterlo [...]

  9. 9Files allo Specchio | PillolHacking.Net
    gennaio 11th, 2010 @ 06:34

    [...] tecnica: l’inversione di un file per byte, A rendere ancora più radicale questa idea è Denis Frati, che si spinge oltre e ipotizza (realizzando anche un codice di esempio) l’inversione di un [...]

Leave a Reply

  1.  
  2.  
  3.  
  4. XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
You can keep track of new comments to this post with the comments feed.

Cerca

 

settembre: 2010
L M M G V S D
« ago    
 12345
6789101112
13141516171819
20212223242526
27282930  

Categorie

Blogroll

Feed