安全笔记:综合|信息隐藏中的隐写术(最新修改时间:2019.5.30)
基础
隐写术和加解密的区别:加解密的话,就是会出现一些神秘的,可疑的字符串或者是数据之类的。而隐写术的话,就是信息明明就在你的面前,你却对他视而不见。隐写术在CTF中出现时,常常会和加解密结合起来一起出现,或者是一些编码方式一起出现,以提高题目的难度。
载体
常见载体:图片、音频、视频等。
图片的常见隐藏位置:将信息隐藏在文件的各个地方,常见的地方有:结束符之后、jpg文件中的exif(jpg头部插入图片的信息,可以控制,不会影响图片,可以通过查看图片属性,exif编辑器等)、png文件的IDAT块(pngcheck软件查看IDAT文件的块,winhex可以取出异常块进行分析)
因此,我们应该对各类文件格式具有一定程度的了解。
编程辅助
通过编程辅助来对目标进行处理。
常用语言:python
隐写方法——图片
将图片和压缩包进行连接
方式:cmd命令下:copy /b2.jpg+1.zip 3.jpg实现1.zip与2.jpg连接生成一个文件名为3.jpg的图片,将3.jpg的文件类型改为zip,再对3.zip进行解压,即可得到1.zip中压缩的文件。
原理:jpg结束符为FFD9(16进制),zip文件类型是附在jpg结束符后面,因此不会影响图片正常显示。
常用工具:winhex、binwalk(kali命令 binwalk 文件名.jpg检索匹配文件头)
修改LSB低位数据
方式:png文件每个颜色有8bit,修改像素中的最低的1bit,即可实现信息的隐藏,且不可被人眼看出。
注意:LSB最低有效位,只能用于png和bmp图片(原因:jpg有损压缩、png无损压缩、bmp无压缩,防止隐写数据被损坏)
工具:stegsolve(浏览三个颜色通道中的每一位即可)
通过损坏文件
方式:通过winhex修改文件,达到文件损坏的目的,隐藏图片的内容。
注意:这就需要对jpg、png、bmp、gif甚至各类音频、视频文件的格式非常熟悉。
常用工具:winhex
双图
方式:将两张图片经过sub等运算进行合成(通常将图片改为bmp文件类型再进行运算,防止压缩影响)
常用工具:compare(kali命令 compare 1.png 2.png diff.png 对比1.png和2.png生成一个有差异的图片diff.png)、stegsolve
隐写方法——音频
隐写方法——视频
资料
PNG
参考资料:
PNG格式:https://www.cnblogs.com/fengyv/archive/2006/04/30/2423964.html
PNG中CRC检验错误:https://www.bbsmax.com/A/gVdnlMVXJW/
PNG图像格式文件(或者称为数据流)由一个8字节的PNG文件署名(PNG file signature)域和按照特定结构组织的3个以上的数据块(chunk)组成。PNG使用从LZ77派生的无损数据压缩算法。
(1) PNG文件署名域
8字节的PNG文件署名域用来识别该文件是不是PNG文件。该域的值是:
(2) 数据块的结构
PNG文件格式分析:
前8个字节89 50 4E 47 0D 0A 1A 0A为png的文件头,该段格式是固定的。
之后的25个字节为chunk[0]段,可以分为以下几块:
前4个字节代表数据块的长度(将其化为十进制),数据块包含了png图片的宽高等信息,该段格式是固定的。
之后的4个字节是文件头数据块的标示(即ASCII码的IHDR),该段格式也是固定的。
之后进入13位数据块,前8个字节中:
前4个字节代表该图片的宽,该段数据是由图片的实际宽决定的。
后4个字节代表该图片的高,该段数据是由图片的实际高度决定的。
再往后数5个字节,
最后4位为该png的CRC检验码,该段数据是由IDCH以及十三位数据块计算得到的。
判断是否为crc校验码错误的方法:
- windows下图片可以打开,其他系统下图片不能打开
- 使用010editor的template检测
- 使用诸如tweakpng,pngcheck等工具
修复png的crc检验码方法:
- 计算出正确的图片高和宽,并用16进制编辑器修复
- 利用windows忽略crc检验码的特性,我们可以用tweakpng任意修改图片的宽和高,直至得到有用的信息。
GIF
参考资料:
GIF格式:https://dev.gameres.com/Program/Visual/Other/GIFDoc.htm
GIF文件内部是按块划分的,包括控制块( Control Block )和数据块(Data Sub-blocks)两种。控制块是控制数据块行为的,根据不同的控制块包含一些不同的控制参数;数据块只包含一些8-bit的字符流,由它前面的控制块来决定它的功能,每个数据块大小从0到255个字节,数据块的第一个字节指出这个数据块大小(字节数),计算数据块的大小时不包括这个字节,所以一个空的数据块有一个字节,那就是数据块的大小0x00。
GIF文件结构如下:
其中GIF署名用来确认一个文件是否是GIF格式的文件,这一部分由三个字符组成:"GIF";文件版本号也是由三个字节组成,可以为"87a"或"89a"。