隐写技巧——利用 JPEG 文件格式隐藏 payload
0x00 前言
继续对图片隐写技巧的学习,这次是对 JPEG 文件格式的学习和理解。同 PNG 文件的格式对比,JPEG 文件相对简单,读取其中隐藏 payload 的方式大同小异,两者区别在于文件格式不同,可供利用的细节存在差异。
本文相关工具:
- 16 进制编辑器:
Hex Editor
- 隐写检测:
Stegdetect
下载地址: https://github.com/abeluck/stegdetect
- 编辑 Exit 信息:
MagicEXIF
下载地址: http://www.magicexif.com/
- 分析 JPEG 图片格式:
JPEGsnoop
下载地址: http://www.impulseadventure.com/photo/jpeg-snoop.html
0x01 相关概念
JPEG 文件
JPEG 是 Joint Photographic Experts Group(联合图像专家组) 的缩写
- 支持有陨压缩
- 不支持透明
- 不支持动画
- 非矢量
JEPG 同 JPG 的区别
- JPEG 既可作为扩展名,又能代表文件格式
- JPG 是 JPEG 的简写,代表扩展名
- JPEG 和 JPG 基本上是没有区别的,它们的格式也是通用的
色彩模型
采用 YCrCb 色彩模型,更适合图形压缩,而不是 RGB
- Y 表示亮度
- Cr 表示红色分量
- Cb 表示蓝色分量
人眼对图片上的亮度 Y 的变化远比色度 C 的变化敏感. 如果每个点保存一个 8bit 的亮度值 Y, 每 2x2 个点保存一个 CrCb 值, 图象在肉眼中的感觉不会起太大的变化,而且节省一半的空间
- RGB 模型 4 个点需要 4x3=12 字节
- YCrCb 模型 4 个点需要 4+2=6 字节
[R G B] -> [Y Cb Cr] 转换:
- Y = 0.299R + 0.587G + 0.114*B
- Cb = - 0.1687R - 0.3313G + 0.5 *B + 128
- Cr = 0.5 R - 0.4187G - 0.0813*B + 128
[Y,Cb,Cr] -> [R,G,B] 转换:
- R = Y + 1.402 *(Cr-128)
- G = Y - 0.34414(Cb-128) - 0.71414(Cr-128)
- B = Y + 1.772 *(Cb-128)
文件格式
JPEG 文件大体上可以分成两个部分:标记码和压缩数据
标记码:
由两个字节构成,第一个字节是固定值 0xFF
,后一个字节则根据不同意义有不同数值
在每个标记码之前可以添加数目不限的无意义的 0xFF 填充,连续的多个 0xFF 可以被理解为一个 0xFF,并表示一个标记码的开始
常见的标记码:
- SOI 0xD8 图像开始
- APP0 0xE0 应用程序保留标记 0
- APPn 0xE1 - 0xEF 应用程序保留标记 n(n=1~15)
- DQT 0xDB 量化表(Define Quantization Table)
- SOF0 0xC0 帧开始(Start Of Frame)
- DHT 0xC4 定义 Huffman 表(Define Huffman Table)
- DRI 0XDD 定义差分编码累计复位的间隔(Define Restart Interval)
- SOS 0xDA 扫描开始(Start Of Scan)
- EOI 0xD9 图像结束
压缩数据:
前两个字节保存整个段的长度,包括这两个字节
注:这个长度的表示方法按照高位在前,低位在后,与 PNG 文件的长度表示方法不同
例如长度是 0x12AB,存储顺序为 0x12,0xAB
Exif 信息
Exif 文件是 JPEG 文件的一种,遵从 JPEG 标准,只是在文件头信息中增加了拍摄信息和索引图
用相机拍出来的 jpeg 都会有这个信息
储存在 APP1(0xFFE1) 数据区中
接下来两字节保存 APP1 数据区(即 Exif 数据区) 的大小
接着为 Exif Header,固定结构:0x457869660000
后面为 Exif 的数据
查看 Exif 信息的工具: exiftool
下载地址:https://github.com/alchemy-fr/exiftool
编辑 Exit 信息的工具: MagicEXIF
下载地址:http://www.magicexif.com/
添加操作如图
0x02 常见隐写方法
- DCT 加密
- LSB 加密
- DCT LSB
- Average DCT
- High Capacity DCT
- High Capacity DCT - Algorithm
目前已经有很多开源的工具能够实现以上高级的隐写方法
常见隐写工具:
- JSteg
- JPHide
- OutGuess
- Invisible Secrets
- F5
- appendX
- Camouflage
当然,对应的隐写检测工具也出现了很久
比如: Stegdetect
下载地址:https://github.com/abeluck/stegdetect
0x03 利用 JPEG 文件格式隐藏 Payload
接下来介绍在学习文件格式后产生的一些隐藏思路:
1、直接在尾部添加数据
如图,不会影响图片的正常浏览
2、插入自定义 COM 注释
COM 注释为 0xff 和 0xfe
插入数据 0x11111111
长度为 0x04
总长度为 0x06
完整的十六进制格式为 0xffff000611111111
插入位置为 DHT 前面,如图
插入后如图,不影响图片的正常查看
将 ff 改为 fe,如图,同样不影响图片的正常查看
3、插入可被忽略的标记码
原理同上,标志码换成可被忽略的特殊值
例如:
- 00
- 01 *TEM
- d0 *RST0
- dc DNL
- ef APP15
经测试以上标识码均不影响图片的正常查看
4、修改 DQT
DQT: Define Quantization Table
标识码为 0xdb
接下来两字节表示长度
接下来一字节表示 QT 设置信息
前 4bit 为 QT 号
后 4bit 为 QT 精度,0=8bit,否则为 16bit
最后是 QT 信息,长度为 64 的整数倍
查看测试图片的 DQT 信息,如图
长度为 0x43,十进制为 67
00 表示 QT 号为 0,精度为 8bit
接着 64 字节为 QT 信息字节
注:此处 DQT 格式参考自 http://www.opennet.ru/docs/formats/jpeg.txt
尝试将这 64 字节替换,如图
前后对比如图,能够发现图片的变化
如果仅仅是调整其中部分字节,改为 payload,那么能有多大区别呢,对比如图
依次类推,可供修改的位置还有很多
0x04 检测和识别
对于以上的隐藏方法,借助 jpeg 图片格式分析工具就能发现其中的痕迹
比如 JPEGsnoop
下载地址:http://www.impulseadventure.com/photo/jpeg-snoop.html
支持如下文件的格式分析:
- .JPG - JPEG Still Photo
- .THM - Thumbnail for RAW Photo / Movie Files
- .AVI* - AVI Movies
- .DNG - Digital Negative RAW Photo
- .PSD - Adobe Photoshop files
- .CRW, .CR2, .NEF, .ORF, .PEF - RAW Photo
- .MOV* - QuickTime Movies, QTVR (Virtual Reality / 360 Panoramic)
- .PDF - Adobe PDF Documents
实际测试:
如下图,发现了图片中添加的 COM 注释
如下图,通过查看 DQT 的数据识别添加的 payload,0x11 对应的十进制为 17
同样,JPEGsnoop 能够解析 jpeg 图片的 EXIF 信息,如下图
注:
为便于测试,截图中的以下数值通过 MagicEXIF 软件手动添加:
EXIF Make/Model: OK [test] [???]
EXIF Makernotes: NONE
EXIF Software: OK [MagicEXIF Metadata Codec 1.02]
0x05 补充
相比于 png 文件,由于 jpeg 文件没有对图像数据的校验位,所以在 jpeg 文件中添加 payload 简单了很多
下载 JPEG 图片解析并执行 payload 的方法不再介绍
0x06 小结
本文对 JPEG 的格式进行介绍,着重分析如何根据 JPEG 的文件格式,利用特定标志码隐藏 payload,这种方式虽然不会影响图片的正常浏览,但是借助于格式分析软件仍能够发现其中的细节。介绍 JPEG 格式的官方文档里面待学习的内容还有很多,认识越深,可供研究的技巧将会更多。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: ADAudit Plus 利用分析——数据加密分析
下一篇: Covenant 利用分析
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论