Copy Link
Add to Bookmark
Report

Nascondere dati in un file JPG

DrWatson's profile picture
Published in 
guide hacker
 · 2 Feb 2019

Come avrete capito, quello che sto proponendo e' inserire dei dati all'interno di files di immagini, in particolare all'interno di files JPG.
La scelta di usare i files JPG per nascondere dei dati non e' stata presa casualmente. I files JPG negli ultimi anni hanno visto una diffusione altissima, infatti li si puo' trovare dovunque, partendo dalla maggior parte dei siti web, per arrivare agli album fotografici digitali.
Sicuramente se provate a lanciare il seguente comando

 
$ find / -name *.jpg


nei vostri computer di casa salteranno fuori diverse centinaia di files (meglio sorvolare su che immagini sono)
Percio' per il principio che le cose si nascondono meglio nella confusione e all'interno di altre cose che non attirano l'attenzione i files JPG mi sono sembrati la scelta migliore. Ma prima di iniziare ecco una spiegazione che spiega qualcosa sul formato JPG.

I files JPG sono formati da un certo numero di segmenti, ognuno dei quali puo' essere lungo al massimo 65535 (2^16) Byte ed inizia con un marcatore. Ogni marcatore e' formato da 2 Byte, il primo sempre con valore 0xFF ed il secondo con un valore compreso tra 0x01 e 0xFE. Il secondo byte specifica il tipo di marcatore. Se il segmento contiene dei dati i 2 Byte che seguono il marcatore indicano la grandezza dei dati. Se, invece, il segmento non contiene dati dopo il marcatore comincia subito il segmento successivo.

Ogni segmento percio' ha la seguente struttura:

 
[FFxx][nnnn][dati]
^^ ^
| | Dati (nnnn Byte - 2) ) Parti
| Intero contenente la lunghezza dei dati + 2 (2 Byte) )
Facoltative
Marcatore (2 Byte)

Si noti che il numero contenente la grandezza dai dati e' memorizzato con la notazione Bin Endian, e non Little Endian come si e' abituati nei sistemi x86.
Tutti i files JPG iniziano con un segmento senza dati identificato dal marcatore FFD8 e terminano con un segmento sempre senza dati identificato dal marcatore FFD9. Tra questi 2 segmenti si possono trovare un numero qualsiasi di altri segmenti.
Per capire meglio si prenda in esempio la seguente rappresentazione esadecimale (parziale) di un file JPG. Come si puo' vedere i primi 2 byte sono esattamente il marcatore di inizio immagine FFD8. Siccome questo marcatore non prevede dati aggiuntivi per il segmento i seguenti 2 Byte dovranno essere per forza il marcatore di un nuovo segmento. Ed infatti e' proprio cosi', il segmento seguente e' identificato dal marcatore FFE0.
Siccome questo marcatore prevede dati, i seguenti 2 Byte identificano la grandezza della parte dati del segmento.
A questo punto per sapere a che indirizzo inizia il segmento successivo basta sommare all'indirizzo del Byte successivo al marcatore la grandezza della parte dati, quindi 0x00000004 + 0x0010 = 0x00000014. A questo indirizzo infatti si trova proprio FFED che e' un marcatore valido. Gli ultimi 2 Byte del file sono FFD9 ovvero il marcatore che identifica la fine dell'immagine.

 
00000000 FFD8 FFE0 0010 4A46 4946 0001 0201 012C ......JFIF.....,
00000010 012C 0000 FFED 00AA 5068 6F74 6F73 686F .,......Photosho
00000020 7020 332E 3000 3842 494D 03ED 0000 0000 p 3.0.8BIM......
00000030 0010 012B FFD9 0002 0002 012B FFD9 0002 ...+.......+....
00000040 0002 3842 494D 03F3 0000 0000 0008 0000 ..8BIM..........
00000050 0000 0000 0000 3842 494D 2710 0000 0000 ......8BIM'.....
00000060 000A 0001 0000 0000 0000 0002 3842 494D ............8BIM
00000070 03F4 0000 0000 0012 0035 0000 0001 002D .........5.....-
...
...

...
00006780 E8DF 87EC D37C 8B6B 5F6F E1EB 5DF1 4D07 .....|.k_o..].M.
00006790 D7F5 053A 573A 469D CFD0 4AF5 A60D DF3F ...:W:F...J....?
000067A0 FFD9 ..

In realta' le cose sono un po' piu' complicate, ma per la comprensione e la realizzazione di quello che voglio proporre non serve sapere di piu.
L'idea che mi e' venuta per nascondere i dati e' molto semplice.
Ogni immagine comincia con il marcatore FFD8 e termina con il marcatore FFD9.
Tutti gli eventuali dati che seguono quest'ultimo marcatore vengono ignorati dai browser o dai programmi di gestione di immagini in quanto l'immagine e' gia' terminata. Quindi un ottimo posto dove nascondere i dati e' proprio la parte finale del file.
Per provare che il tutto non crea problemi ai programmi di gestione di immagini provate a lanciare un comando del genere

 
$cat trash >> image.jpg

e poi provate ad aprire l'immagine. Non noterete niente di strano.
Se al posto di accodare trash si accodasse un file contenente dati significativi (ovviamente criptati... la prudenza non e' mai troppa) si otterrebbe un file JPG perfettamente funzionante, contenente i nostri dati.
Per la maggior parte della gente questa sembrera' un'immagine normalissima, mentre per quelli che invece conoscono il segreto questa immagine acquistera' un valore particolare.
Di seguito riporto i listati di due programmini pseudo-idioti che si occupano rispettivamente di criptare e fondere un file contenente dei dati con un file JPG e di estrarre e decriptare i dati precedentemente inseriti.
Breve descrizione di JPG-Fusion.c
Richiede in input 3 nomi di files: il nome del file JPG, il nome del file contenente i dati da nascondere e il nome di file che verra' creato.
Il programma banalmente copia il contenuto del file JPG nel nuovo file, cripta il file di dati e lo accoda sempre al nuovo file creato.

Come algoritmo di criptazione e' stato usato un algoritmo a chiave simmetrica.
La chiave di 16 Byte viene creata prendendo 16 Byte casuali del file JPG. I dati vengono criptati facendo lo XOR tra essi e la chiave. Viene sfruttato il fatto che A XOR B = C e C XOR B = A.
Il programma restituisce 2 numeri che sono necessari a JPG-Split.c per
recuperare i dati. Il primo numero non e' altro che la grandezza del file JPG, sapendo questo ovviamente si sa dove comincia il file dati. Il secondo numero
invece e' il numero di Byte del file JPG da cui si comincia a prelevare la chiave per criptare.

dei possibili miglioramenti
Sarebbe possibile senza troppi sforzi inserire anche il nome del file di dati all'interno del file di Output. Per il momento il nome del file viene perso, lo si deve infatti fornire in input a JPG-Split.
- Volendo si potrebbe cambiare algoritmo di criptazione in uno a chiave pubblica e privata.
- Si potrebbe aggiungere alla fine del file creato il marcatore di fine immagine (FFD9) cosi' che il file possa sembrare corretto ad un'analisi superficiale.

Breve descrizione di JPG-Split.c
Richiede in input 4 parametri: il nome del file da cui prelevare i dati, il nome del file da creare, la lunghezza del file JPG e il numero del Byte da cui iniziare a creare la chiave per decriptare i dati.
Il programma banalmente estrae i dati, li decripta e li salva sul file.

Però
volendo si raggiunge lo stesso risultato aprendo la jpg con un editorHEX e aggiungendo alla fine dei dati...

← previous
next →
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT