130 likes | 265 Views
Steganografia. Un esempio pratico. Il formato TAR. Possiamo pensare ad un archivio TAR come ad un contenitore di file. Per ogni file nell’archivio viene memorizzato: il contenuto del file informazioni aggiuntive (nome file, permessi, ecc.)
E N D
Steganografia Un esempio pratico
Il formato TAR • Possiamo pensare ad un archivio TAR come ad un contenitore di file. • Per ogni file nell’archivio viene memorizzato: • il contenuto del file • informazioni aggiuntive (nome file, permessi, ecc.) • Possiamo usare alcuni byte delle informazioni aggiuntive per memorizzare un messaggio steganografato.
Informazioni aggiuntive Per ogni file presente nell’archivio sono presenti le seguenti informazioni: • nome • permessi • user id, user name • group id, group name • dimensione • tempo dell’ultima modifica • altre informazioni per gestire file non regolari (es. link, device, ecc.)
36 bit • Possiamo usare gli ultimi 8 bit per memorizzare un byte di informazione. • La data originale è distorta al più di 255 secondi, ovvero 4 minuti e 15 secondi. Il campo mtime • Il campo mtime, di 36 bit, memorizza la data dell’ultima modifica al file. • Essa è codificata come il numero di secondi trascorsi dalle ore 0:00 del 01/01/1970.
Nome mtime File1 xxxxxxx File2 xxxxxxx File3 xxxxxxx File4 xxxxxxx File5 xxxxxxx File6 xxxxxxx File7 xxxxxxx File8 xxxxxxx File9 xxxxxxx xx xx xx xx xx xx xx xx xx 00 00 00 04 63 69 61 6F xx 00 00 00 04 63 69 61 6F c i a o Codifica di un messaggio • Dato un messaggio lungo n byte, lo codifichiamo su n+4 byte. • I primi 4 byte rappresentano la lunghezza del messaggio. • I successivi n byte contengono il messaggio vero e proprio. • Lunghezza massima di un messaggio: 4 Gb. • Esempio: • messaggio = “ciao” • lunghezza = 4 • archivio di 9 file
Codice sorgente - steganotar.py • Scritto in Python 2.3 (http://www.python.org) • Perché Python? • Semplice • Portabile (Linux, Windows, Mac, ecc.) • Modulo standard per i file TAR • Chi non conosce Python? • Sembra pseudocodice. • In laboratorio è installato Python 1.5, perciò steganotar.py non funziona.
Codifica di un messaggio • Data una stringa in input, dobbiamo produrre un’altra stringa così formata: • i primi 4 byte memorizzano la lunghezza, espressa in notazione big endian. • i successivi byte memorizzano il messaggio vero e proprio. • La funzione struct.pack effettua la conversione tra intero a 32 bit e stringa di byte in big endian. defencode_message(data): length = struct.pack('!i', len(data)) return length + data
Decodifica di un messaggio • Dato un messaggio codificato, dobbiamo decodificarlo per produrne una rappresentazione usabile. • Prima di tutto leggiamo i primi 4 byte e li convertiamo in un intero a 32 bit (con la funzione struct.unpack). • Ora che sappiamo la lunghezza, sappiamo quanti byte leggere per ottenere il messaggio originale. defdecode_message(data): length = struct.unpack('!i', data[:4])[0] return data[4:4+length]
Creazione di un archivio Alcune variabili utilizzate: • data: messaggio gia` codificato (array di byte) • tar: oggetto che rappresenta l'archivio tar • files: lista di nomi di file da inserire nell'archivio • MASK = 0xFFFFFFF00 for index, filename inenumerate(files): tarinfo = tar.gettarinfo(filename) if index < len(data): char = data[index] tarinfo.mtime &= MASK tarinfo.mtime |= ord(char) tar.addfile(tarinfo, file(filename))
Lettura di un archivio defread_tar(filename): tar = tarfile.open(filename, 'r') data = [] for tarinfo in tar: # ottiene l’ultimo byte di mtime char = tarinfo.mtime & 0xFF data.append(chr(char)) tar.close() return''.join(data)
Dimostrazione pratica [anto@anto tmp]$ ls provafile01 file02 file03 file04 file05 file06 file07 file08 file09file10 file11 file12 file13 file14 file15 [anto@anto tmp]$ ls -l prova/file05-rw-r--r-- 1 anto anto 0 dic 12 15:21 file05 [anto@anto tmp]$ steganotar.py --encode prova.tar prova/ Messaggio [anto@anto tmp]$ tar tvf prova.tar | grep file05-rw-r--r-- anto/anto 0 2003-12-12 15:22:53 prova/file05 [anto@anto tmp]$ steganotar.py --decode prova.tarMessaggio
Memorizzare un intero file • Se dalla linea di comando non è specificato alcun messaggio, steganotar.py lo legge da standard input. • Possiamo sfruttare questa caratteristica per steganografare file arbitrari in un archivio TAR. • Esempio: creiamo un archivio che contiene i sorgenti del kernel di Linux: sono 14050 file, quindi possiamo memorizzare circa 14 Kb di informazioni. [anto@anto tmp]$ steganotar.py --encode linux.tar /usr/src/linux < \ Steganography.txt [anto@anto tmp]$ steganotar.py --decode linux.tar > Steganography2.txt [anto@anto tmp]$ diff Steganography.txt Steganography2.txt
Implementazioni alternative • Abbiamo scelto di usare il campo mtime, ma potevamo anche scegliere diversamente. • In particolare, i campi uid e gid non sono quasi mai utilizzati: i corrispettivi user name e group name hanno sempre la precedenza. • I campi uid e gid ci avrebbero permesso di memorizzare 4 byte per ogni file nell’archivio. • Purtroppo nella maggior parte dei file TAR i campi uid e gid hanno sempre lo stesso valore, per cui sarebbe facile scoprire che un file è steganografato.