隐写技巧——利用JPEG文件格式隐藏payload
0x00 前言
继续对图片隐写技巧的学习,这次是对JPEG文件格式的学习和理解。同PNG文件的格式对比,JPEG文件相对简单,读取其中隐藏payload的方式大同小异,两者区别在于文件格式不同,可供利用的细节存在差异。
本文相关工具:
- 16进制编辑器:Hex Editor
- 隐写检测:Stegdetect
下载地址:
https://github.com/abeluck/stegdetect
- 编辑Exit信息:MagicEXIF
下载地址:
- 分析JPEG图片格式:JPEGsnoop
下载地址:
http://www.impulseadventure.com/photo/jpeg-snoop.html
0x01 相关概念
JPEG文件
JPEG是Joint Photographic Experts Group(联合图像专家组)的缩写
- 支持有陨压缩
- 不支持透明
- 不支持动画
- 非矢量
JPEG同JPG的区别
- JPEG既可作为扩展名,又能代表文件格式
- JPG是JPEG的简写,代表扩展名
- JPEG和JPG基本上是没有区别的,它们的格式也是通用的
色彩模型
采用YCrCb色彩模型,更适合图形压缩,而不是RGB
- Y表示亮度
- Cr表示红色分量
- Cb表示蓝色分量
人眼对图片上的亮度Y的变化远比色度C的变化敏感. 如果每个点保存一个8bit的亮度值Y, 每2×2个点保存一个CrCb值, 图象在肉眼中的感觉不会起太大的变化,而且节省一半的空间
- RGB模型4个点需要4×3=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
下载地址:
添加操作如图
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格式的官方文档里面待学习的内容还有很多,认识越深,可供研究的技巧将会更多。
隐写技巧——利用JPEG文件格式隐藏payload的更多相关文章
- 深入理解JPEG图像格式Jphide隐写
0x00 隐写原理 Jphide是基于最低有效位LSB的JPEG格式图像隐写算法,使用JPEG图像作为载体是因为相比其他图像格式更不容易发现隐藏信息,因为JPEG图像在DCT变换域上进行隐藏比空间域隐 ...
- [CTF隐写]png中CRC检验错误的分析
[CTF隐写]png中CRC检验错误的分析 最近接连碰到了3道关于png中CRC检验错误的隐写题,查阅了相关资料后学到了不少姿势,在这里做一个总结 题目来源: bugku-MISC-隐写2 bugku ...
- UNCTF杂项题Hidden secret 之NTFS交换数据流隐写
---恢复内容开始--- 做这道题目的经历比较坎坷,题目中用于隐藏flag的jpg文件出了问题,导致不能被交换数据流隐写所以出题人换了一次题目,最后做法也换了,不过出题人一开始的考察点还是基于NTFS ...
- stegsolve---图片隐写查看器
今天做CTF隐写术的题偶然发现一隐写图片查看的神器------stegsolve,分享给大家 stegsolve下载地址:http://www.caesum.com/handbook/Stegsolv ...
- shellcode隐写到像素RGB免杀上线到CS
利用把Shellcode隐写到图片像素RGB进行免杀上线到CS --by:chenw 0x01 前言 前几天跟一个朋友一起搞一个站的时候,发现那个站点开了很多杀软,使用CS的powershell马无法 ...
- 记XDCTF的misc之旅---base64隐写
bWFpbigpe2ludCBpLG5bXT17KCgoMSA8PDEpPDwgKDE8PDEpPDwoMTw8Cm==ICAgICAgIDEpPDwoMTw8KDE+PjEpKSkrKCgxPDwx ...
- CTF-练习平台-Misc之 隐写2
二.隐写2 下载文件后解压,发现是一个png图片,依照老套路查看属性,没有发现 用WinHex打开,在图片文件中,修改图片宽度,将箭头处的A改为F,保存后打开图片 发现flag(对于png的文件格式详 ...
- ctf中关于图片的隐写随笔(不全)
①JPG图片的结束符,十六进制常为FFD9 ②binwalk的原理是:检查常见的文件头信息,如果不符合,一定有隐藏信息.③JPG是有损压缩,PNG是无损压缩,BMP是不压缩. 隐写的基本原理:图片查看 ...
- base64文件隐写脚本
base64文件隐写脚本 base64 可以在文件中隐藏信息,记录一下提取脚本 ''' base64文件隐写脚本 import re import base64 b64chars = 'ABCDEFG ...
随机推荐
- Java File类总结和FileUtils类
Java File类总结和FileUtils类 文件存在和类型判断 创建出File类的对象并不代表该路径下有此文件或目录. 用public boolean exists()可以判断文件是否存在. Fi ...
- Android+PHP服务器+MySQL实现安卓端的登录
时隔已久的一个任务,今天终于可以画上一个句号了.心情是万分的激动,虽然这份小成就来的有点迟但还是按捺不住心情的澎湃.下面我就先上几张图片来展示一下我的成绩 android源代码: 首先最重要的一件事是 ...
- 查看Android系统是User模式还是Eng模式
root@itek82_wet_kk:/ # cat default.prop # # ADDITIONAL_DEFAULT_PROPERTIES # ro.secure= ro.allow.mock ...
- Android 内容提供者简介
在Android应用中,我们可以使用显式意图(Explicit Intent)来直接访问其他应用的Activity,但是这仅限于Activity的范畴:如果需要使用其他应用的数据,还需要用到另外一种组 ...
- iOS 单例传值遇见问题
单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模式的要点有三个:一是某个类只能有一个实例: ...
- objective-c系列-NSDictionary&NSMutableDictionary
********************************************* NSDictionary ***************************************** ...
- 【读书笔记】iOS-程序进入到后台
当一个iOS应用被送到后台,它的主线程会被暂停.你用NSThread的detachNewThreadSelector:toTar get:withObject:类方法创建的线程也被挂起了.如果你想在后 ...
- android 数据存储Ⅱ
本章继续讲解在Android开发中,数据的存储与管理.涉及知识点:SQLite,SwipeRefreshLayout控件刷新. 1.功能需求 练习使用SQLite 做一个登录界面,数据库字段包含用户名 ...
- Web性能--TCP的构成
前言:阅读<Web性能权威指南>摘录笔记.在这本书开篇就读到第一句话令人印象深刻: "合格的开发者知道怎么做,而优秀的开发者知道为什么那么做". 内容大纲: 1.因特网 ...
- 在Window 下安装Redis数据库
小Alan国庆后就要回深圳找工作了,最近在复习工作所需的相关的技术,今天刚好复习到redis,redis是一个非关系型(NoSql)数据库,采用key-value的方式存储数据,她可以保存字符串(St ...