隐写术

本文转自: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就能看出端倪。

隐写术_第1张图片



直接用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...		...	数据	采样数据

隐写术_第2张图片

这是我随便下载的一个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文件。




你可能感兴趣的:(学习总结,其他)