逆向工程实战手册 第 97 章

第 97 章 隐写术与媒体取证(Steganography)

隐写术(Steganography)= 把秘密藏在"看起来正常"的载体里(图片/音频/视频/文档)。这是 CTF 取证大类(misc/forensics)的核心,也是恶意软件数据隐藏的手法。本章覆盖隐写分类、取证方法、工具链与完整流程。核心原则:先理解容器结构,再找隐藏通道,最后提取还原——不要盲目暴力。

📍 知识点地图 | 主题:隐写术 | 前置:第9章 | 后续:— | 核心概念:LSB、附加数据、频谱图、Polyglot、binwalk

97.1 隐写分类学(先懂藏哪了)

按载体:
  图片: LSB/调色板/EXIF/附加数据/像素差异
  音频: 频谱图/低比特位/回声隐藏
  视频: 帧间差异/隐藏轨道
  文档: 隐藏文本/宏/对象流/元数据
  容器: 附加压缩包/文件拼接/多格式(polyglot)

按原理:
  替换型: 用秘密位替换载体冗余位(LSB)
  附加型: 秘密拼在文件尾(最常见!)
  转换型: 变换域(DCT 系数/频域)
  生成型: 载体本身就是从秘密生成的
  元数据类型: EXIF/注释/时间戳

97.2 取证流程(四步方法论)

Step 1: 容器真相(Container Truth)—— 先搞清楚文件"真实结构"
  □ 头部/块表/EXIF/元数据/缩略图/文件大小异常
  □ 声明格式 vs 实际结构(polyglot/附加尾部/畸形尾)
  □ 记录关键偏移/帧号/通道边界

Step 2: 候选通道检查(Inspect Candidate Channels)
  □ Alpha/调色板顺序/RGB-YUV 平面/LSB/频谱图特征
  □ 文档对象流/视频帧差异
  □ 按证据驱动尝试(不盲目暴力所有变换)

Step 3: 载荷路径重建(Reconstruct Payload Path)
  容器 → 通道/载体 → 提取 → 解压/解码 → 最终解析
  分离"提取成功"与"最终解读"(通道命中 ≠ 拿到数据)

Step 4: 验证与打包证据
  最终载荷 + 使用的通道 + 每步命令
  (如果提取后主要是密码学问题 → 转第 9/34 章)

97.3 图片隐写(最常见的载体)

LSB(最低有效位)

原理: 像素的 R/G/B 最低位替换为秘密位(肉眼不可见)
检测: 文件大小异常(每 8 像素藏 1 字节)/ 颜色分布异常
提取: 按位序提取 → 拼字节 → 还原文件

工具: zsteg(综合)/ LSB-Stegano / Stegsolve(逐位查看)
zsteg image.png            # 自动尝试常见 LSB 变体

附加数据(最常被忽略)

原理: 秘密直接拼在文件尾(JPEG 的 EOI 后 / PNG 的 IEND 后)
检测: 文件尾部有未知数据 / 大小异常
提取: binwalk / 手动 dd 截取

binwalk image.png          # 发现尾部嵌入的 ZIP/数据
dd if=image.png bs=1 skip=<偏移> of=hidden.bin

调色板与元数据

调色板顺序: GIF 调色板重排藏数据(Stegsolve 看)
EXIF: 注释/缩略图/厂商字段(exiftool -a)
PNG IDAT: 像素数据的压缩流(深度分析)

97.4 音频隐写

频谱图(最常考):
  频谱里直接画出文字/图像
  工具: Audacity → 频谱图视图(Spectrogram)

LSB 音频: 低比特替换(steghide / DeepSound)
回声隐藏: 回声延迟编码(少见)
相位编码: 相位修改(罕见)

检查清单:
  □ 频谱图(第一优先!)
  □ 波形异常(幅度/周期)
  □ 尾部附加数据(binwalk)
  □ 元数据(ID3 标签)

97.5 视频与文档隐写

视频:
  帧间差异(隐藏帧/慢速闪帧)
  隐藏音轨/字幕轨
  时间戳/元数据
  工具: ffmpeg 抽帧 / 逐帧对比

文档(PDF/Office):
  隐藏文本(白字/零宽字符)
  对象流(PDF 压缩对象)
  宏/嵌入对象
  文档元数据(作者/公司/时间)
  工具: pdf-parser / oletools / 文本提取对比

97.6 容器与多格式(Polyglot)

Polyglot = 一个文件同时是多种格式(JPEG+ZIP 等)
  头是图片,尾是压缩包(binwalk 直接发现)
  用于: 绕过文件类型过滤(上传漏洞配合)

检测: binwalk 全扫 / file 与实际结构对比
提取: binwalk -e(自动提取所有内嵌)

97.7 隐写工具链

工具 用途
binwalk 附加数据/内嵌文件发现(第一优先)
exiftool 元数据全量提取
zsteg PNG/BMP LSB 综合
Stegsolve 图片逐位通道分析
steghide 音频/图片隐藏与提取
Audacity 频谱图/波形分析
ffmpeg 视频抽帧
oletools Office 文档分析
pdf-parser PDF 对象流
strings 永远先跑(隐藏的明文)
CyberChef 提取后的解码链

97.8 完整取证流程(端到端)

1. file + strings + binwalk(三连扫,最省力)
2. exiftool 元数据
3. 按类型深入:
   图片 → Stegsolve 通道 + zsteg
   音频 → 频谱图 + steghide
   视频 → 抽帧对比
   文档 → oletools/pdf-parser
4. 提取出数据后:
   解压(binwalk -e)/ 解码(CyberChef)
   若加密 → 转密码学章节
5. 验证: 最终载荷完整/可读

97.9 检查清单

□ file 类型确认
□ strings 明文扫描
□ binwalk 附加数据/内嵌
□ exiftool 元数据
□ 图片: LSB/调色板/通道
□ 音频: 频谱图/波形
□ 视频: 帧差异/轨道
□ 文档: 对象流/宏/隐藏文本
□ Polyglot 检测
□ 提取 → 解压/解码 → 最终载荷
□ 记录: 每步命令 + 通道 + 载荷

动手练习

  1. 用 steghide 或 LSB 工具自己藏一段文本进图片,再按流程提取(体验藏与取的对称性)。
  2. 在 Audacity 里生成一个含文字频谱的音频(Spectrogram 上写字),练习识别。
  3. 用 binwalk 分析一个"图片尾接 ZIP"的 polyglot,完整提取内嵌文件。
  4. 分析一张图片的 EXIF(exiftool -a),找出所有元数据字段。

深入阅读

  • 仓库:CTF-Sandbox-Orchestrator/competition-stego-media/(隐写 CTF 子技能)
  • 仓库:CTF-Sandbox-Orchestrator/competition-stego-media/references/stego-media.md(隐写检查清单)
  • 仓库:CTF-Sandbox-Orchestrator/competition-crypto-mobile/(提取后密码学衔接)
  • 仓库:skills/reverse-engineering/crypto-decode-tools.md(解码链)