“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:
- se pur si comprendesse l’utilizzo di tale sistema, ricreare un set di header e footer per recuprare i file così trattati, richiedrebbe tempo;
- se il file così creato venisse posizionato su un supporto privo di file system e scritto con dati casuali (/dev/urandom) la sua identificazione potrebbe essere..ardua.
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.
9 Responses to ““Sono un invertito!”..ammise il file (proof of concept)”
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
2admin
dicembre 31st, 2009 @ 00:14
(con questa http://www.pubblicitaitalia.it/Allegati/1444.JPG faccia)
..sagace questa ragazza!….
3titticimmino
dicembre 31st, 2009 @ 02:34
la matematica è la mia croce e la mia delizia
e quella sarei io… invertita ???
mmm se mi ci metto, e chiedendo lumi a Riemann .. ah se la sua ipotesi viene dimostrata!!! Vi voglio vedere!
ah Buon anno 2010!
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
5titticimmino
gennaio 2nd, 2010 @ 14:58
:O evvabbè Nanni nessuno è perfetto!
6Nanni Bassetti
gennaio 2nd, 2010 @ 21:49
Per punizione dovrai guardare 10 puntate del Grande Fratello ahahahahah
7titticimmino
gennaio 3rd, 2010 @ 15:25
10 ?( bel numero binario ) pensavo di più!
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 [...]
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