Steganography - JPEGsnoop

15

Sto cercando di superare una sfida di steganografia del CTF. Ho provato diversi metodi per mostrare i dati nascosti nel file senza fortuna. Ho usato JPEGsnoop sull'immagine e ho ottenuto questo risultato:

*** Decoding SCAN Data ***
  OFFSET: 0x0000026F
  Scan Decode Mode: Full IDCT (AC + DC)
  Scan Data encountered marker   0xFFD9 @ 0x0001DF10.0
*** NOTE: YCC Clipped. MCU=(  15,  10) YCC=(  256,  132,  130) Y Overflow @ Offset 0x0001DF0F.3
*** NOTE: YCC Clipped. MCU=(  15,  10) YCC=(  256,  123,  121) Y Overflow @ Offset 0x0001DF0F.3
*** NOTE: YCC Clipped. MCU=(  16,  10) YCC=(  256,  131,  126) Y Overflow @ Offset 0x0001DF0F.3
*** NOTE: YCC Clipped. MCU=(  16,  10) YCC=(  258,  127,  127) Y Overflow @ Offset 0x0001DF0F.3
*** NOTE: YCC Clipped. MCU=(  16,  10) YCC=(  256,  126,  126) Y Overflow @ Offset 0x0001DF0F.3
*** NOTE: YCC Clipped. MCU=(  16,  10) YCC=(  256,  129,  122) Y Overflow @ Offset 0x0001DF0F.3
*** NOTE: YCC Clipped. MCU=(  16,  10) YCC=(  258,  129,  124) Y Overflow @ Offset 0x0001DF0F.3
*** NOTE: YCC Clipped. MCU=(  16,  10) YCC=(  258,  126,  129) Y Overflow @ Offset 0x0001DF0F.3
*** NOTE: YCC Clipped. MCU=(  17,  10) YCC=(  256,  120,  137) Y Overflow @ Offset 0x0001DF0F.3
*** NOTE: YCC Clipped. MCU=(  17,  10) YCC=(  258,  124,  126) Y Overflow @ Offset 0x0001DF0F.3
    Only reported first 10 instances of this message...
  Compression stats:
    Compression Ratio: 31.12:1
    Bits per pixel:     0.77:1

Queste note possono essere indicate su un segmento di dati nascosto?

Aggiorna

L'immagine è ben formata. Non ci sono doppi FFD9. il file termina con FFD9 senza spazio tra la fine dei dati e l'FFD9. Ho provato a trovare i valori di "overshooting" luma (Y) usando python:

#!/usr/bin/python

from PIL import Image


def main():
    im = Image.open("l0v3m3.jpg")
    im = im.convert("YCbCr")
    y, cb, cr = im.split()
    seq = y.getdata()
    for x in seq:
        if x > 255:
            print x


if __name__ == '__main__':
    main()

Ma, come sembra, i valori di Y sono tagliati. Se qualcuno conosce un modo per ottenere il valore Y senza ritagliare sarei molto grato. btw: ecco il file

    
posta Uriel Frankel 13.02.2017 - 12:25
fonte

1 risposta

21

Non penso che tu stia guardando un segmento di dati nascosti. L'FFD9 è un marker EOI ei dati che seguono dovrebbero essere ignorati, quindi non mi aspetterei che JPEGSnoop provi a decodificarlo. Il fatto che faccia sembra indicare che l'errore non è correlato all'EOI.

Un valore YCC non valido potrebbe indicare che un valore fuori range viene effettivamente utilizzato per codificare le informazioni. Sono possibili diversi schemi possibili. Ad esempio potresti considerare uno schema a doppio bit in cui la violazione non si verifica o si verifica in singoletti o in coppia:

OK OK    = it was not possible to code a bit in this pixel
FAIL OK  = this pixel codes a zero (or a one)
FAIL FAIL= this pixel codes a one (or a zero)

Poiché la maggior parte dei decodificatori JPEG silenziano silenziosamente i valori fuori intervallo, questo tipo di codifica non è immediatamente visibile e non ha un impatto notevole sulle dimensioni dell'immagine (cioè, non vi è alcun rumore ad alta frequenza sovrapposto sull'immagine).

Un altro schema possibile con JPEG in particolare è quello di abusare della codifica ITU-R BT.601, che ha valori YCC legali tra 16 e 235 (ma in un byte è possibile memorizzare valori 0-255). Ogni volta che trovi un pixel che è molto nero (16) o molto bianco (235), è adatto per incorporare quattro bit extra nel suo nibbble meno significativo. Uscita 12 anziché 16 e decodificatori ITU la tradurranno come "neri", mentre il decodificatore steganografia leggerà "1100b".

Inoltre, quando YCC è denormale, i valori per le componenti Cb e Cr dovrebbero essere insignificanti (credo). Il colore nero non ha tonalità, quindi qualsiasi tonalità specificata verrà sempre decodificata in nero. Ciò significa che è possibile utilizzare questi valori per memorizzare ulteriori informazioni.

D'altra parte, tutto quanto sopra potrebbe essere sbagliato e quei dati potrebbero essere effettivamente dopo il marcatore End-Of-Image. Quello che è, non potrei dire; puoi provare e visualizzarlo tramite un editor esadecimale e vedere se ha senso . potrebbe essere, ad esempio, una sequenza ASCII, e il motivo per cui si verifica un errore di ritaglio YCC è perché "SQUADRATO OSSIFRAGE" non è in realtà una decomposizione DCT valida dopo tutto, quindi svanisce a zero (o a 1 ) e una volta convertito in YCC, naturalmente, non rientra nell'intervallo.

Aggiornamento

Ok, il file termina con FFD9 (EOI), quindi a condizione che non abbia due EOI:

 ....legitimate image.... FFD9 EXTRA DATA ...FFD9

quindi gli "errori" YCC segnalati da JPEGSnoop devono fare riferimento ai dati "immagine legittima".

Questi byte sono DCT corretto decodificato , ma decodificano in una terzina (Y, Cb, Cr) in cui il valore Y non è compreso nell'intervallo ed è quindi ritagliato. Nel debug di JPEGsnoop vedi che hai valori di 256 e 258, che sono (ovviamente) non 8 bit.

Questo può essere usato per trasportare informazioni mappando il denormal YC b C r valori su singoli bit:

         JPEG    Stego
255 ...  white   00
256 ...  white   01
257 ...  white   10
258 ...  white   11

In questo modo, ogni pixel con luma completa potrebbe codificare due bit di informazioni nascoste (o potresti codificare solo 0 come 256 e 1 come 258, se per caso l'algoritmo intero non emette mai 257).

Per decodificarlo, devi recuperare tutti quegli esempi (hai bisogno di un Decoder JPEG che non ritaglia valori ), e rilascia i bit" extra ". Quindi scopri quali sono quei significati .

    
risposta data 13.02.2017 - 13:42
fonte

Leggi altre domande sui tag