本文转自:http://www.0x01f.com/blog/61%E3%80%82 ,转载请说明出处 0x01f原创
隐写术跟密码学有什么区别呢?顾名思义,隐写是把信息隐藏起来,你看不到;而加密则是把信息变化,是可以看到变化之后的信息的。隐写术在安全领域有着举足轻重的地位,大量商业间谍攻击活动都会利用到隐写术,不明就里的小伙伴往往会被看不到的危险坑害。
最简单的例子,种子图,大家都用过。windows下一条语句就可以搞定:copy /b 1.jpg+plan.zip 1.jpg。然后就可以很风骚的传播了。现在用于隐藏个人数据的app,广义来说那也利用了隐写。
隐写技术分两大类:插入和替换,插入往往利用文件格式的无关数据或者空白区域,放置需要的数据,不会改变原始数据,只是增加了隐写的内容;替换的经典例子就是LSB替换方法,把每个字节最低有效位变换,不会改变文件大小,但是源文件发生了变化。
插入隐写
CTF中常常出现JPEG文件之后新增数据的隐写题目,上述那个种子图制作命令就是利用JPEG文件以0xFF 0xD9结束,在后面增加了一个新的文件。这样图片查看器不会读取后面的内容,显示不变,但是用WINHEX就能看出端倪。
直接用copy命令+/b选项就可以在文件末尾添加额外内容,包括图片、压缩包、apk等。
jpeg格式分为两部分:标记码和压缩数据,标记码有字节,高字节固定为0xFF。标记码如下:
SOI : FF D8
DQT : FF DB
DRI : FF DD
SOF0 : FF C0 这是图像真正开始的地方
DHT : FF C4 huffman表
SOS : FF DA
……
EOI : FF D9 文件结束标志
我们可以在标记码之间插入隐写数据,也不会影响图片阅读。
替换隐写
这里重点介绍LSB,最低有效位(Least Signaficant Bit),利用红蓝绿三原色调色板,每个原色可以用8位表示,红绿蓝一共24位。把原色的最后一位改变,(0和1相互变化),组合最后一位就得到隐藏的信息。肉眼几乎不可能看出来。
看《数据隐藏技术揭秘》这本书,有了很多的隐写数据想法。比如PE文件的导入表,OriginalFirstThunk运行起来之后就没用了,这些地方都可以用来隐藏数据。说道可执行文件的隐藏,那就涉及文件加壳的很多东西了,如果结合加密的话,还原难度会非常大。
隐写工具
StegSpy 根据隐藏信息软件的特征分析,类似PE。
Stegdetect 利用jpeg压缩原理,检查DCT(离散余弦变换)频率系数,通过检测异常判定是否隐写了内容,非常好用。
stegosolve 神器,能解决好多图片隐藏信息。
stegdetect -tjopi -s10.0 *.jpg
音频隐写
除了图片,越来越多隐写载体变成音频、视频。虽然花哨很多,但是原理不变,任何东西拆分开来还不就是二进制嘛。
这里以wav文件为例,先看看它的文件格式:
文件头
偏移地址 字节数 类型 内容
00H~03H 4 字符 资源交换文件标志(RIFF)
04H~07H 4 长整数 从下个地址开始到文件尾的总字节数
08H~0BH 4 字符 WAV文件标志(WAVE)
0CH~0FH 4 字符 波形格式标志(FMT)
10H~13H 4 整数 过滤字节(一般为00000010H)
14H~15H 2 整数 格式种类(值为1时,表示数据为线性PCM编码)
16H~17H 2 整数 通道数,单声道为1,双声音为2
18H~1BH 4 长整数 采样频率
1CH~1FH 4 长整数 波形数据传输速率(每秒平均字节数)
20H~21H 2 整数 数据的调整数(按字节计算)
22H~23H 2 整数 样本数据位数
数据块
偏移地址 字节数 类型 内容
24H~27H 4 字符 数据标志符(data)
28H~2BH 4 长整型 采样数据总数
2CH... ... 数据 采样数据
这是我随便下载的一个wav文件,可以看到跟实际的稍有差距,这里逐字节解释一下:
(1)“52 49 46 46”, 字符“RIFF”,固定格式,WAVE文件头。
(2)“32 6F 00 00”, WAV文件的数据大小,等于文件总字节数减去8。拉到最后可以看到真实大小是6F40。
(3)“57 41 56 45 66 6D 74 20”,字符“WAVEfmt”,固定格式。
(4)“1E 00 00 00”,DWORD对应数字18,PCMWAVEFORMAT部分大小,后面的这个段内容是E8个字节。
(5)“55 00”,这是一个WORD,对应定义为编码格式
(6)“01 00”,这是一个WORD,表示声道数为1,单声道Wav。
(7)“C0 5D 00 00”,代表的是采样频率,采样率(每秒样本数),表示每个通道的播放速度
(8)“A0 0F 00 00”,代表每秒的数据量,波形音频数据传送速率,其值为通道数×每秒样本数×每样本的数据位数/8。播放软件利用估计缓冲区的大小。
(9)“01 00”对应数字是2,表示块对齐的内容。数据块的调整数(按字节算的),其值为通道数×每样本的数据位值/8。播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。
(10)中间的貌似跟格式有关,我也没查到这个格式的更详细说明。
(11)“64 61 74 61”,字符“data”,标示头结束,开始数据区域。
(12)“00 6F 00 00”,数据区的开头,后面的数据总数。
如果是多声道,那么需要用实际长度除以声道数,得出每个声道字节数。因为音频样本以16字节为单位,所以可以知道每个声道的采样值。将LSB算法用到某个声道的采样值上,就可以实现数据的隐藏。北理工那个跨时非常长的CTF比赛就有一道类似的题目,我觉得非常不错。
音频隐写工具S-TOOL可以很方便的实现wav音频文件LSB隐藏数据。MP3Stego可以将wav文件和需要隐藏的文件合并成一个新的MP3文件。