安全笔记:综合|信息隐藏中的隐写术(最新修改时间: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文件。该域的值是:

安全笔记:综合|信息隐藏中的隐写术(最新修改时间:2019.5.30)

(2) 数据块的结构

安全笔记:综合|信息隐藏中的隐写术(最新修改时间:2019.5.30)

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文件结构如下:

安全笔记:综合|信息隐藏中的隐写术(最新修改时间:2019.5.30)

其中GIF署名用来确认一个文件是否是GIF格式的文件,这一部分由三个字符组成:"GIF";文件版本号也是由三个字节组成,可以为"87a"或"89a"。