隐写术 - JPEGsnoop

信息安全 隐写术 ctf
2021-09-01 05:05:31

我正在努力克服 CTF 隐写术挑战。我尝试了不同的方法来取消隐藏文件中的隐藏数据,但没有运气。我在图像上使用了 JPEGsnoop,得到了以下输出:

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

这些注释可以指示隐藏的数据段吗?

更新

图像形成良好。没有双FFD9。文件以 FFD9 结尾,数据结尾和 FFD9 之间没有间隙。我尝试使用 python 找到“过冲”亮度(Y)值:

#!/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()

但是,看起来,Y 值被剪裁了。如果有人知道一种无需剪裁即可获得 Y 值的方法,我将不胜感激。顺便说一句:这是文件

1个回答

我不认为您正在查看隐藏的数据段。FFD9 是一个 EOI 标记,它后面的数据应该被忽略,所以我不希望 JPEGSnoop 尝试实际解码它。事实上,它似乎表明错误与意向书无关。

非法 YCC 值可能表明超出范围的值实际上用于编码信息。几种可能的方案是可能的。例如,您可能正在查看一个双位方案,其中违规要么不发生,要么以单重态或成对出现:

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)

由于大多数 JPEG 解码器会默默地裁剪超出范围的值,因此这种编码不会立即可见,并且不会对图像大小产生很大影响(即,图像上没有叠加高频噪声)。

JPEG 可能的另一种方案是滥用 ITU-R BT.601 编码,该编码具有 16 到 235 之间的合法 YCC 值(但在一个字节中您可以存储值 0-255)。每当您发现一个非常黑 (16) 或非常白 (235) 的像素时,都适合在其最低有效半字节中嵌入四个额外位。输出 12 而不是 16,ITU 解码器会将其翻译为“黑色”,而您的隐写解码器将读取“1100b”。

此外,当 YCC 异常时,Cb 和 Cr 分量的值应该是微不足道的(我认为)。黑色没有色调,因此您指定的任何色调都将始终解码为黑色。这意味着您可以使用这些值来存储附加信息。

另一方面,上面的一切都可能是错误的,这些数据实际上可能在图像结束标记之后。它是什么,我不能说;您可以尝试通过十六进制编辑器查看它,看看它是否有意义比如说,它可能是一个 ASCII 序列,它引发 YCC 裁剪错误的原因是因为“SQUEAMISH OSSIFRAGE”实际上并不是一个有效的 DCT 分解,所以它消失为零(或 1),并且一旦转换为 YCC它自然落在范围之外。

更新

好的,文件以 FFD9 (EOI) 结尾,所以只要它没有两个EOI :

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

那么JPEGSnoop报告的YCC“错误”必须参考“合法图像”数据。

这些字节已正确 DCT 解码它们解码为三元组 (Y, Cb, Cr),其中 Y 值超出范围,因此被剪裁。您在 JPEGsnoop 调试中看到您的值是 256 和 258,它们(显然)不是 8 位。

可用于通过将非正规YC b C r值映射到单个位来携带信息:

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

这样,每个具有完整亮度的像素都可以编码两位隐藏信息(或者您可能只将 0 编码为 256,将 1 编码为 258,如果整数算法从不输出 257)。

要对其进行解码,您需要恢复所有这些样本(您需要一些不裁剪值的 JPEG 解码器),并转储掉“额外”位。然后弄清楚这些位是什么意思