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(联合图像专家组)的缩写

  1. 支持有陨压缩
  2. 不支持透明
  3. 不支持动画
  4. 非矢量

JPEG同JPG的区别

  1. JPEG既可作为扩展名,又能代表文件格式
  2. JPG是JPEG的简写,代表扩展名
  3. 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

下载地址:

http://www.magicexif.com/

添加操作如图

0x02 常见隐写方法

  • DCT加密
  • LSB加密
  • DCT LSB
  • Average DCT
  • High Capacity DCT
  • High Capacity DCT – Algorithm

以上隐写方法引用自:

https://www.blackhat.com/docs/asia-14/materials/Ortiz/Asia-14-Ortiz-Advanced-JPEG-Steganography-And-Detection.pdf

目前已经有很多开源的工具能够实现以上高级的隐写方法

常见隐写工具:

  • 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的方法不再介绍

(可参照https://3gstudent.github.io/3gstudent.github.io/%E9%9A%90%E5%86%99%E6%8A%80%E5%B7%A7-%E5%88%A9%E7%94%A8PNG%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E9%9A%90%E8%97%8FPayload/)

0x06 小结

本文对JPEG的格式进行介绍,着重分析如何根据JPEG的文件格式,利用特定标志码隐藏payload,这种方式虽然不会影响图片的正常浏览,但是借助于格式分析软件仍能够发现其中的细节。介绍JPEG格式的官方文档里面待学习的内容还有很多,认识越深,可供研究的技巧将会更多。

隐写技巧——利用JPEG文件格式隐藏payload的更多相关文章

  1. 深入理解JPEG图像格式Jphide隐写

    0x00 隐写原理 Jphide是基于最低有效位LSB的JPEG格式图像隐写算法,使用JPEG图像作为载体是因为相比其他图像格式更不容易发现隐藏信息,因为JPEG图像在DCT变换域上进行隐藏比空间域隐 ...

  2. [CTF隐写]png中CRC检验错误的分析

    [CTF隐写]png中CRC检验错误的分析 最近接连碰到了3道关于png中CRC检验错误的隐写题,查阅了相关资料后学到了不少姿势,在这里做一个总结 题目来源: bugku-MISC-隐写2 bugku ...

  3. UNCTF杂项题Hidden secret 之NTFS交换数据流隐写

    ---恢复内容开始--- 做这道题目的经历比较坎坷,题目中用于隐藏flag的jpg文件出了问题,导致不能被交换数据流隐写所以出题人换了一次题目,最后做法也换了,不过出题人一开始的考察点还是基于NTFS ...

  4. stegsolve---图片隐写查看器

    今天做CTF隐写术的题偶然发现一隐写图片查看的神器------stegsolve,分享给大家 stegsolve下载地址:http://www.caesum.com/handbook/Stegsolv ...

  5. shellcode隐写到像素RGB免杀上线到CS

    利用把Shellcode隐写到图片像素RGB进行免杀上线到CS --by:chenw 0x01 前言 前几天跟一个朋友一起搞一个站的时候,发现那个站点开了很多杀软,使用CS的powershell马无法 ...

  6. 记XDCTF的misc之旅---base64隐写

    bWFpbigpe2ludCBpLG5bXT17KCgoMSA8PDEpPDwgKDE8PDEpPDwoMTw8Cm==ICAgICAgIDEpPDwoMTw8KDE+PjEpKSkrKCgxPDwx ...

  7. CTF-练习平台-Misc之 隐写2

    二.隐写2 下载文件后解压,发现是一个png图片,依照老套路查看属性,没有发现 用WinHex打开,在图片文件中,修改图片宽度,将箭头处的A改为F,保存后打开图片 发现flag(对于png的文件格式详 ...

  8. ctf中关于图片的隐写随笔(不全)

    ①JPG图片的结束符,十六进制常为FFD9 ②binwalk的原理是:检查常见的文件头信息,如果不符合,一定有隐藏信息.③JPG是有损压缩,PNG是无损压缩,BMP是不压缩. 隐写的基本原理:图片查看 ...

  9. base64文件隐写脚本

    base64文件隐写脚本 base64 可以在文件中隐藏信息,记录一下提取脚本 ''' base64文件隐写脚本 import re import base64 b64chars = 'ABCDEFG ...

随机推荐

  1. 转:与Microsoft Visual Studio集成良好的第三方工具

    我们都知道,Microsoft Visual Studio(简称VS)是微软开发的一个非常高效的集成开发环境,但即使已经发展到VS2012,仍然有许多不尽人意的地方.一般来讲,一个项目中需要有控件.代 ...

  2. Linux下EclipseCDT工程和TFS的持续集成CI实践

    在Linux下使用TFS自动构建,需要自动执行连接tfs服务器的操作,命令行文件包TEE-CLC-10.1.0.2011121402.zip,下载地址:http://www.microsoft.com ...

  3. Object-c字符串操作

    字符串操作: -(void) testString{ NSString *str1 = @"some string"; NSLog(@"%@", str1); ...

  4. view渐变色,透明度渐变

    1 功能描述 开发中经常遇到这样的需求:view2显示在view1上面,透过view2可以渐渐的看到view1.效果如图1所示:view1是一个imageView,view2是一个普通view.vie ...

  5. 安全攻防之SQL注入(通过sqlmap搞定所有问题)

    第一步: sqlmap基于Python,所以首先下载: http://yunpan.cn/QiCBLZtGGTa7U  访问密码 c26e 第二步: 安装Python,将sqlmap解压到Python ...

  6. php设计模式 适配器模式

    适配器模式,可以将截然不同的函数接口封装成统一的API: 应用举例,PHP的数据库操作有Mysql.Mysqli.pdo三种,可以用适配器模式统一成一致,类似的场景还有cache适配器,将memcac ...

  7. asp.net开发中常见公共捕获异常方式总结(附源码)

    本文实例总结了asp.net开发中常见公共捕获异常方式.分享给大家供大家参考,具体如下: 前言:在实际开发过程中,对于一个应用系统来说,应该有自己的一套成熟的异常处理框架,这样当异常发生时,也能得到统 ...

  8. 3、Javascript学习 - IT软件人员学习系列文章

    接下来,我们开始进入Javascript语言的学习. Javascript语言是一种解释性的语言,不同于ASP.NET.C#语言的这种编译性的语言.它随着HTML网页的发布而发布,就是说嵌入到HTML ...

  9. 2014.1.23 Discuz论坛迁移+VPS配置手记

    虽说这也不是我第一次转移这个论坛了,但毕竟还是第一次自己配置VPS,写点东西记一下 一:关于VPS的配置 1.用TeamViewer连接服务器 这个VPS的IDC自己带有一个远程控制的页面,用浏览器打 ...

  10. U-BLOX GPS 模块及GPRMC指令解析

    受朋友所托,调试一款GPS模块,该模块是UBLOX的NEO-6M GPS模组.想到用这款GPS的人较多,自己日后也有可能在用到这个模块,就写下这份笔记. 1. 介绍 基本信息如下: 1, 模块采用U- ...