Esteganografía - JPEGsnoop

15

Estoy tratando de superar un desafío de esteganografía CTF. He intentado diferentes métodos para mostrar los datos ocultos en el archivo sin suerte. Utilicé JPEGsnoop en la imagen y obtuve esta salida:

*** 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

¿Pueden indicar estas notas en un segmento de datos ocultos?

Actualización

La imagen está bien formada. No hay doble FFD9. el archivo termina con FFD9 sin espacio entre el final de los datos y el FFD9. Traté de encontrar los valores de luma (Y) "excedentes" utilizando 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()

Pero, como parece, los valores de Y están recortados. Si alguien sabe una forma de obtener el valor Y sin recortar, estaría muy agradecido. btw: aquí está el archivo

    
pregunta Uriel Frankel 13.02.2017 - 12:25
fuente

1 respuesta

21

No creo que estés mirando un segmento de datos ocultos. El FFD9 es un marcador EOI y los datos que lo siguen deben ignorarse, por lo que no esperaría que JPEGSnoop intentara decodificarlo. El hecho de que parece indicar que el error no está relacionado con el EOI.

Un valor YCC ilegal podría indicar que un valor fuera de rango realmente se usa para codificar información. Varios esquemas posibles son posibles. Por ejemplo, podría estar mirando un esquema de doble bit en el que la violación no se produce, o se produce en singlets o en pares:

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)

Como la mayoría de los decodificadores JPEG recortan silenciosamente los valores fuera de rango, este tipo de codificación no es visible inmediatamente y no tiene un gran impacto en el tamaño de la imagen (es decir, no hay ruido de alta frecuencia superpuesto en la imagen).

Otro esquema posible con JPEG específicamente es abusar de la codificación ITU-R BT.601, que tiene valores YCC legales entre 16 y 235 (pero en un byte puede almacenar valores 0-255). Cuando encuentre un píxel que sea muy negro (16) o muy blanco (235), es adecuado para incrustar cuatro bits adicionales en su mordisco menos significativo. La salida 12 en lugar de 16, y los decodificadores ITU lo traducirán como "negro", mientras que su decodificador de esteganografía leerá "1100b".

Además, cuando YCC es denormal, los valores para los componentes Cb y Cr deberían ser insignificantes (creo). El color negro no tiene tono, por lo que cualquier tono que especifique siempre se decodificará a negro. Esto significa que puede usar estos valores para almacenar información adicional.

Por otra parte, todo lo anterior puede ser incorrecto y esos datos pueden estar en realidad después del marcador de fin de imagen. Qué es, no podría decirlo; puede probar y verlo a través de un editor hexadecimal y ver si tiene sentido . podría ser, por ejemplo, una secuencia ASCII, y la razón por la que produce un error de recorte YCC es porque "SQUEAMISH OSSIFRAGE" no es realmente una descomposición DCT válida, por lo que desaparece a cero (o 1 ), y una vez convertido a YCC, naturalmente cae fuera del rango.

Actualizar

Bien, el archivo termina con FFD9 (EOI), así que siempre que no haya dos EOIs:

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

entonces los "errores" de YCC informados por JPEGSnoop deben referirse a los datos de "imagen legítima".

Estos bytes son correctamente DCT descodificado , pero descodifican a un triplete (Y, Cb, Cr) donde el valor Y está fuera de rango y, por lo tanto, se recorta. En la depuración de JPEGsnoop ves que tienes valores de 256 y 258, que (obviamente) no son de 8 bits.

Este se puede usar para transportar información mediante el mapeo denormal YC b C r valores a bits individuales:

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

De esta manera, cada píxel con luma completa podría codificar dos bits de información oculta (o podría codificar solo 0 como 256 y 1 como 258, si por alguna razón el algoritmo de enteros nunca genera 257).

Para decodificarlo, necesita recuperar todas esas muestras (necesita algunas decodificador JPEG que no recorta valores ), y descarga los bits" extra ". Luego, averigua qué significan esos bits .

    
respondido por el LSerni 13.02.2017 - 13:42
fuente

Lea otras preguntas en las etiquetas