隐写术是关于信息隐藏,即不让计划的接收者之外的任何人知道信息的传递事件(而不只是信息的内容)的一门技巧与科学,英文写作Steganography。而密码编码是关于信息加密,即设想到信息可能会被接受者之外的第三方获取而采取的一种措施,通过通信双方预先设定的规则对信息进行加密,使第三方即使获取到信息也无法理解其含义。所以隐写术重点在于信息的隐藏,密码编码重点在于信息的加密,这两者属于完全不同的概念。
一、图片隐写
大部分的文件都有其固定的格式,比如常见的图片格式PNG,JPG,都是由一系列的特殊的数据块组成
1、PNG:
IHDR(文件头数据块)、PLTE(调色板数据块)、IDAT(图像数据块)、IEND(图像结束数据块)四个标准数据块和一些辅助数据块组成。
每个数据块由Length(长度)、Chunk Type Code(数据块类型码)、Chunk Data(数据块数据)和CRC(循环校验码)四个部分
举例:PNG
固定字节开始(89 50 4E 0D 0A 1A 0A),通过这串字节确定是一个png文件,图像结束数据IEND表示PNG文件结束,它的长度一般是00 00 00 00,数据标识为49 45 4E 44,这之后的数据通常就会被大部分的图片查看软件忽略掉,这就是最基本的隐写,可以直接在最后加内容,一般情况下不会被发现。(无论是字符还是文件都可以)
最常见的工具:binwalk
2、EXIF(可交换图像文件格式)
用来记录数码相机的属性信息和拍摄数据,EXIF可以被附加在JPEG、TIFF(标签图像文件格式)、RIFF(资源互换文件格式)等文件中,为其增加有关数码相机拍摄信息的内容,缩略图获图像处理软件的一些版本信息
工具:exiftool,photocap
3、LSB(最低有效位)
大多数的png图像中,每个像素都是由R、G、B三原色组成,(某些图片还包含A通道表示透明度),每种颜色一般用8位的数据标识(0x00~0xFF)通过修改其最低位隐藏信息,每个像素可以携带3位的信息
工具:stegsolve,zsteg
4、盲水印
数字水印技术,图片中的盲水印可以添加在图片的空域或者频域中,空域技术就是直接在信号空间中嵌入水印信息,LSB就是一种典型的方式,那什么是频域
如图就是一段音乐的时域,我们听到的音乐就是一段在时域上不断振动的波,这段音乐同样可以表示为下图的乐谱,一段乐谱就可以看作一段音乐在频域中的表示,可以反映音乐频率的变化,如果时域中的波形简化成一段正弦波,那么在频域中用一个音符即可表示
要将时域或空域中表示的信号转换到频域中,要用傅里叶变换,源自对于傅里叶级数的研究,研究表明,复杂的周期函数可以用一系列简单的正弦波之和代替,将信号函数进行傅里叶变换,可以分离出其中各频率的正弦波,不同成分的频率在频域中以峰值形式表示,就可以得到其频谱,得到图像的频域图像之后,将水印编码后随即分布到各频率,与原频域进行叠加,将叠加后的频域进行逆变换,就得到了添加了盲水印的图片
提取盲水印就是将原图和带水印的图在频域中相减,再根据原来水印的编码方式解码。就可以提取出水印
工具:blindwatermark、adobe、audition
五、算法类型
LSB、jsteg、f3、f4、f5、jphide、outguess
二、文本隐写
文档格式微调法
行移:行移是指调整文本文件中的垂直行距来隐藏信息的方法
嵌入信息的行的相邻_上下两行位置不动,作为参考,然后该嵌入信息的行上移,表示嵌入“1”,行下移,表示嵌入信息”0”。
字移:字移是指通过将某行的字符进行水平移动来隐藏信息
如将一个单词左移或右移,而与其相邻的单词则不进行移动,可以作为提取隐藏信息时的参考,如规定左移代表“1”,右移代表“0”。
修改字符颜色:改变文本字符颜色的十六进制颜色码微调,来嵌入信息。
空格标点符号法:
使用中英文版本的逗号表示01
添加空格和回车
基于空格和回车的隐写术是利用人类视觉系统对微小间隔不敏感的特点而设计的
与字移、行移等不同的地方在于,字移、行移等操作适用于利用格式化文档(如word)传递信息的过程,而对于纯文本文档(如txt)不能进行微调操作,这时可以考虑利用空格或是回车来隐藏信息。
与字移相比,字移引起的间隔往往是人类肉眼所捕捉不到的,但空格带来的间隔如果插入为止不当则会引起怀疑(如汉语中汉字与汉字间通常是没有间隔的,过多的间隔会引起注意,因此该方法通常适用于英文文本),因此插入位置的选择往往是该类隐写术的关键。
逗号可为1,句号可为0以此隐藏
对标点改变字体隐藏信息
字体特征法
通过两种不同的字体来实现0和1转换
汉字结构的间距来隐藏信息,或将两个字符缩小间距使其看起来像一个字符
自然语言法
同义词替换(绝对同义词,相对同义词)
语法变换(宾语前置,谓语后置,定语后置等实现0,1隐藏)
利用office中自带的隐藏功能:
在word中选中要隐藏的文字,右键,选择字体,选择隐藏,确定后发现这几个字不见了,而word中字数统计也相应减少。
通过文件->选项->显示->勾选隐藏文字,即可显示出隐藏的文字
另:
可以对文档设置编辑保护,文档可以打开,无法编辑
设置方法:导航栏上的审阅->限制编辑->勾选编辑限制->启动强制保护->设置密码
题目:
从文件-选项,勾选隐藏文字
然后替换,用0替换英文逗号,用1替换中文逗号
在线转
0ffse就是偏转的意思,我们放到winhex里
拿去base32可以得到一个小提示
doc文件(doc和zip的文件头一样,这里给了提示的)修改文件头为50 4B 03 04,复制后面的,另存为
这里会发现我们无法编辑里面的任何内容,作者经过加密的,上面给了提示14位的数字密码,但是爆破就太麻烦了,这里题目有个小漏洞,虽然我们无法修改字体颜色,但是可以直接复制粘贴出来到其他编辑器上可以显示
RmxhZyU3QnNob3dfY3RmX3Rzd19jYyU3RA==
base64+url解密得flag
三、音频:
1、音频的波形或频谱为某种编码或密码,找到后进行解码解密即得到隐藏信息
2、音频文件中嵌入了数据,需要提取出来,得到隐藏信息
基于波形的隐写
波形图中横坐标是时间,纵坐标是幅值。通过对图像的控制可以模拟为一种编码或密码
可以在波形图中隐藏莫斯电码,隐藏二进制数据
基于频谱图的隐写
频谱是波形经过傅里叶变换得到的,横坐标是频率,纵坐标是幅值,表示各某时间点上各频率正弦波的幅值大小,越亮的地方表示这个频率越响
若波形图无法看出隐藏信息,可以转换成频谱图
使用mp3stego的隐写
在音频文件中嵌入比特流,需要使用密码
写入:encode -E 隐藏的文件 -P 口令密码 载体音频文件 生成的文件
读取:decode -X -P 口令密码 文件名
四、压缩包
涉及方面
爆破、碰撞、伪加密、已知明文分析
文件头特征
压缩包有三种压缩格式rar、7z、zip
zip加密
zip加密可以分为真加密,伪加密
zip有数据区和目录区,只有两个区的全局方式标志位都为加密位时才是真加密
数据区:50 4B 03 04 数据区标志开头 后2个字节为解压文件所需要的版本 后2个字节数据区加密标记位
目录区:50 4B 01 02 目录去标志开头 后2个字节为压缩文件所使用的版本 后2个字节解压文件所需要的版本 后2个字节目录区加密标志位
加密标志位只要是奇数位就表示加密位 偶数不加密
ctf中题目类型
类型 | 特征 | 思路 |
---|---|---|
压缩包+图片 | 压缩包附在图片后,或者图片隐藏压缩包 | |
压缩包加密 | 密码以注释等其它提示形式给出 | |
压缩包伪加密 | 密码没有给出,加密标志位异常 | 修改对应的标志位 |
压缩包爆破 | 密码没有给出,加密标志位正常 | archpr进行爆破 |
crc32碰撞 | 当压缩包被加密,但文件为纯文本文档,且大小很小时 | 涉及程序编写,一般用Binascii 和string库string.ascii_letters |
压缩包已知明文攻击 | 压缩包为zip格式,给出了其中的一个明文,明文的crc32与压缩包中的密文crc32一致 | archpr进行爆破 |
视频隐写
以题为例
首先得到的是一个mp4文件,叫做黄金6年,观看没有发现异常
之后用winhex,在结尾处发现可能为base64编码
对其解码,发现无法正常显示解码,可能为2进制数据
用Python编写程序解码发现rar标记
将其解码的二进制数据另存为rar压缩包
发现有密码
确认不是伪加密后,试图先从视频中寻找密码
用工具potplayer打开,一帧一帧播放,发现
四张二维码,扫描,将得到的信息拼接为iwantplayctf,解开数据包得flag
utterances
GitHub Issues