|
CTF比赛里遇到纯图片题,图片十有八九藏着东西。隐写上周帮学弟看一道Misc题,解密一张看似普通的图片JPEG,题目描述只有“flag在哪里”。隐写他试了binwalk、解密strings、图片exiftool,隐写全空。解密我让他把图片扔进StegSolve,图片切到Blue plane 0,隐写右下角出现半透明文字——flag的解密前半段。后半段呢?图片用zsteg扫LSB,又捞出一截。隐写拼起来,解密提交,通过。 这就是图片隐写的日常。它不靠加密算法硬碰硬,而是把信息塞进像素、文件结构或者颜色通道的缝隙里。你眼睛看到的图,和文件实际承载的数据,往往是两回事。 最基础的一类:文件末尾追加数据。JPEG以FFD9结尾,PNG以IEND chunk收束。攻击者在这之后直接cat一个zip或一段文本进去。图片查看器读到结束标记就停,多余字节被忽略。用`binwalk -e image.jpg`或者`foremost`能直接分离出附加文件。我见过一道题,flag.txt就藏在PNG的IEND之后,十六进制编辑器拉到底部,明文躺在那儿。 LSB(最低有效位)隐写更隐蔽。每个像素的RGB值各占8位,改最后1位,颜色变化肉眼根本分辨不出。把整张图的LSB按顺序提取,拼成字节流,就是隐藏信息。工具用`zsteg`最顺手:`zsteg -a image.png`会遍历所有通道和位平面。有次扫出一串Base64,解码后是flag。注意,PNG无损,LSB可靠;JPEG有损压缩,LSB容易被破坏,所以隐写者更偏爱PNG和BMP。 调色板隐写是另一条路。GIF或PNG-8用索引颜色,调色板里每个颜色的RGB值可以微调。比如把调色板第0项和第1项的红色分量差1,这1就代表一个比特。`StegSolve`的“Color Palette”功能能直接看调色板顺序,异常排列往往就是线索。某次比赛题,调色板前16个颜色按红分量排序后,二进制转ASCII得到“key: stego”。 EXIF和文本块也不能放过。`exiftool image.jpg`看相机型号、GPS、注释字段。有人把flag拆成几段塞进ImageDescription、Artist、Copyright。PNG的tEXt块更直接,`pngcheck -v image.png`列出所有块,tEXt里的关键字和值一目了然。还有更阴的:把flag转成二进制,用黑白像素画成二维码,再缩到图片角落。你放大看才发现有个小方块。 盲水印和频域隐写属于进阶玩法。傅里叶变换后,在幅度谱或相位谱叠加信息,空域看不出任何异常。工具用`opencv`做DFT,或者现成的`blind_watermark`库。这类题通常给两张图——原图和带水印图,要求提取水印。没有原图的话,得靠相位谱重建,难度陡增。 说个真实案例。某次强网杯,一张800×600的PNG,binwalk无附加,zsteg无LSB,exiftool干净。我盯着图看了五分钟,发现左上角像素颜色比周围深一点点。用Python读像素,打印前100个像素的R值,发现每隔8个像素有一个异常值。按这个规律提取,得到一串十六进制。转ASCII,flag出现。隐写者把信息编码在像素坐标的奇偶性里,而不是颜色值本身。 工具不是万能。`StegSolve`、`zsteg`、`binwalk`、`exiftool`、`pngcheck`、`foremost`,这六个覆盖八成基础题。剩下两成靠观察:图片尺寸是否异常?颜色数是否偏少?文件大小与分辨率是否匹配?一张1920×1080的纯色图,文件却有2MB,肯定有问题。用`identify -verbose`看直方图,颜色分布不均匀的地方就是突破口。 最后提醒一句:拿到图片先算哈希,对比题目给的MD5。有时候题目会故意给一张经过二次压缩的图,原图哈希对不上,说明中间被处理过。从处理痕迹反推隐写方式,比盲目扫工具快得多。图片隐写解密,本质是找“不合理”。像素不合理、文件结构不合理、颜色分布不合理。找到那个不合理,flag就在后面。 |