- 文档
- 网络安全
- 教程
【免费下载链接】ctf-wiki
Come and join us, we need you!
本篇技术指南以 CTF-Wiki 开源仓库中 Misc 图片分析 · JPEG(JPG)专题 为主体,系统讲解 JPEG 文件的「段(Segment)」数据结构、0xFFD8/0xFFD9起止标记等底层原理,并完整覆盖 Stegdetect、JPHS(JPHIDE / JPSEEK)与 SilentEye 三款 JPEG 隐写检测工具的参数与用法。读完本文,你将能够在 CTF Misc 题目中快速识别 JPEG 文件结构异常,并针对 JSteg、OutGuess、JPHide 等常见隐写工具嵌入的信息完成检测与提取。
JPEG 文件结构:有损压缩与段式组织
JPEG(JPG)是一种有损压缩格式:将像素信息保存为 JPEG 文件后再读取出来,某些像素值会发生少许变化。在保存时,质量参数可在0 至 100之间选择,参数越大图片越保真,但文件体积也越大;一般情况下选择70 或 80已经足够。此外,JPEG 没有透明度信息,这与支持 Alpha 通道的 PNG 截然不同——这两点决定了 JPEG 隐写通常发生在压缩域的变换系数中,而不是像素最低有效位上。
从底层结构看,JPG 的基本数据结构分为两大类型:「段(Segment)」和「经过压缩编码的图像数据」。段是 JPEG 文件组织信息的骨架,每个段的通用结构如下:
| 名称 | 字节数 | 数据 | 说明 |
|---|---|---|---|
| 段标识 | 1 | FF | 每个新段的开始标识 |
| 段类型 | 1 | 类型编码(称作标记码 Marker) | |
| 段长度 | 2 | 包括段内容和段长度本身,不包括段标识和段类型 | |
| 段内容 | 2 | ≤ 65533 字节 |
需要特别留意两类规则:
- 无长度段的特殊形态:有些段没有长度描述也没有内容,只有段标识和段类型。文件头(SOI)和文件尾(EOI)均属于这种段。
- 填充字节(Fill Bytes):段与段之间无论有多少
FF都是合法的,这些FF称为「填充字节」,解析时必须被忽略。因此在手工检查文件时,连续的FF FF ...并不代表异常,反而是 JPEG 规范允许的正常现象。
常见段类型:从 SOI 到 EOI 的标记地图
段类型由段标识FF之后的第二个字节(标记码)决定。以下为 JPEG 中最常见的段类型对照,也是 CTF 隐写分析中识别文件结构异常的基础参考(对应文档配图 JPEG 常见段类型表):
| 短名称 | 标记码(以 0xFF 开头) | 载荷 | 名称与含义 |
|---|---|---|---|
| SOI | 0xFF, 0xD8 | 无 | Start Of Image,图像起始,JPEG 数据流的开始 |
| SOF0 | 0xFF, 0xC0 | 可变 | 基线 DCT 帧起始,指定宽、高、颜色分量数及子采样格式 |
| SOF2 | 0xFF, 0xC2 | 可变 | 累进 DCT 帧起始,指定宽、高、分量数及子采样格式 |
| DHT | 0xFF, 0xC4 | 可变 | Define Huffman Table(s),定义熵编码用哈夫曼表 |
| DQT | 0xFF, 0xDB | 可变 | Define Quantization Table(s),定义 DCT 量化表 |
| DRI | 0xFF, 0xDD | 4 字节 | 定义重启间隔,指定 RSTn 重启标记的间隔(按 MCU 计) |
| SOS | 0xFF, 0xDA | 可变 | Start Of Scan,扫描起始,其后紧跟熵编码图像数据 |
| RSTn | 0xFF, 0xDn(n=0..7) | 无 | 重启标记,周期插入用于恢复编码误差 |
| APPn | 0xFF, 0xEn(n=0..15) | 可变 | 应用专属段,例如 EXIF 元数据存放于 APP1 段 |
| COM | 0xFF, 0xFE | 可变 | 注释段,存储文本注释 |
| EOI | 0xFF, 0xD9 | 无 | End Of Image,图像结束,JPEG 数据流的终止 |
其中0xFFD8和0xFFD9分别是 JPG 文件的开始与结束标志。CTF 题目中若 JPEG 文件缺失或篡改这两个标记,或 EOI 之后被拼接了额外数据,往往是隐写信息所在位置——这正是结构知识在实战中的直接用途。
JPEG 隐写原理:为何检测发生在 DCT 域
与 PNG 的 LSB 像素位隐写不同(参见仓库同模块的 PNG 文件结构与 LSB 隐写),JPEG 是有损压缩格式,直接修改像素位会在重新压缩时被丢弃或产生明显失真。因此 JPEG 隐写工具(如 JSteg、OutGuess、JPHide 等)通常作用于DCT 频率系数或文件段的冗余空间中。相应地,检测手段也以对 DCT 频率系数做统计分析为主,这正是下文 Stegdetect 的核心工作方式。理解这一点,是选择正确检测工具的前提:拿到一张 JPG,先判断它经何种工具嵌入,再对症下药。
Stegdetect:基于 DCT 统计分析的 JPEG 隐写检测器
Stegdetect 通过统计分析技术评估 JPEG 文件的 DCT 频率系数,可以检测通过JSteg、JPHide、OutGuess、Invisible Secrets、F5、appendX 和 Camouflage等隐写工具隐藏的信息;同时,它还内置基于字典的暴力破解密码方法,能够提取通过 JPHide、OutGuess 和 jsteg-shell 方式嵌入的隐藏信息。
Stegdetect 的命令行参数如下:
-q 仅显示可能包含隐藏内容的图像。 -n 启用检查 JPEG 文件头功能,以降低误报率。如果启用,所有带有批注区域的文件将被视为没有被嵌入信息。 如果 JPEG 文件的 JFIF 标识符中的版本号不是 1.1,则禁用 OutGuess 检测。 -s 修改检测算法的敏感度,该值的默认值为 1。检测结果的匹配度与检测算法的敏感度成正比, 算法敏感度的值越大,检测出的可疑文件包含敏感信息的可能性越大。 -d 打印带行号的调试信息。 -t 设置要检测哪些隐写工具(默认检测 jopi),可设置的选项如下: j 检测图像中的信息是否是用 jsteg 嵌入的。 o 检测图像中的信息是否是用 outguess 嵌入的。 p 检测图像中的信息是否是用 jphide 嵌入的。 i 检测图像中的信息是否是用 invisible secrets 嵌入的。实战中的典型用法:先用默认参数对一批图片做初筛(stegdetect -q *.jpg),再根据-t的候选范围针对性地复查。默认检测组合jopi覆盖了 JSteg、OutGuess、JPHide、Invisible Secrets 四种主流手法;-s敏感度默认值为 1,误报率高时可结合-n开启文件头检查来降低误报,可疑度高时则适当调大敏感度值以提高检出可能性。
JPHS:JPHIDE 与 JPSEEK 的加密隐藏与提取组合
JPHS 是由 Allan Latham 开发设计的 JPEG 图像信息隐藏软件,实现在Windows 和 Linux 系统平台,针对有损压缩 JPEG 文件进行信息加密隐藏和探测提取。软件主要包含两个程序:
- JPHIDE:实现将信息文件加密隐藏到 JPEG 图像的功能;
- JPSEEK:实现从用 JPHIDE 加密隐藏得到的 JPEG 图像中探测并提取信息文件的功能。
Windows 版本的 JPHS 中的JPHSWIN程序具有图形化操作界面,同时具备 JPHIDE 和 JPSEEK 的功能。在命令行环境下,可以按「JPHIDE 嵌入 → 分发图片 → JPSEEK 提取」的流程完成一次完整的隐写与还原演练。
SilentEye:跨平台插件式隐写工具
SilentEye 是一款跨平台(cross-platform)应用,专为方便地使用隐写术而设计,本场景下用于将消息隐藏到图片或声音中。它提供了相当友好的界面,并通过插件系统方便地集成新的隐写算法与加密处理流程。与命令行工具不同,SilentEye 适合在 CTF 解题中对不明确手法的图片进行交互式尝试:加载图片、选择隐写算法插件、设置口令后即可尝试提取。
仓库内的延伸阅读与实践路线
在 CTF-Wiki 仓库中,本专题属于 Misc 图片分析 模块。该模块指出,图像文件能很好地承载黑客文化,CTF 竞赛中经常出现各种图像文件;图像格式涉及元数据、信息丢失与无损压缩、校验、隐写或可视化数据编码等多个方向,是 Misc 的重要出题方向。围绕图片隐写,仓库还配套提供了:
- PNG 文件结构、IHDR 篡改爆破与 LSB 隐写:可与 JPEG 的 DCT 域隐写形成对比;
- GIF 空间轴与时间轴隐写:覆盖另一类常见图片隐写载体。
综合来看,JPEG 隐写分析的完整解题路径是:先用十六进制查看器核对0xFFD8起始、段标记序列与0xFFD9结束标志,确认结构是否被篡改或拼接;再用 Stegdetect 对 DCT 系数做统计分析以缩小工具范围,配合 JPHS、SilentEye 等工具针对 JPHide / OutGuess 系嵌入信息进行提取。掌握 JPEG 的段结构与上述检测工具的参数语义,即可在绝大多数 JPEG 隐写题目中快速定位并还原隐藏信息。
- 文档
- 网络安全
- 教程
【免费下载链接】ctf-wiki
Come and join us, we need you!
相关推荐
CTF 图片隐写实战:GIF 文件格式解析与空间/时间轴隐写分析(ctf-wiki Misc 篇)
CTF 图片隐写实战:GIF 文件格式解析与空间/时间轴隐写分析(ctf wiki Misc 篇) 导读:本文以 ctf wiki 仓库中的 GIF 隐写文档
文档网络安全教程pyc 文件分析:Python 字节码结构与 Stegosaurus 隐写实战(CTF Misc/逆向方向)
pyc 文件分析:Python 字节码结构与 Stegosaurus 隐写实战(CTF Misc/逆向方向) 导读 本文是 CTF Wiki Misc(杂项)专
文档网络安全教程CTF 流量分析实战:DNS 报文结构解析与 dnscat2 隧道隐写提取(ctf-wiki 协议分析指南)
CTF 流量分析实战:DNS 报文结构解析与 dnscat2 隧道隐写提取(ctf wiki 协议分析指南) DNS 是 CTF 流量取证(Traffic Fo
文档网络安全教程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考