基于DCT域的JPG图片隐写
关于JPG图像的压缩
- JPEG图像格式使用离散余弦变换(Discrete Cosine Transform,DCT)函数来压缩图像,而这个图像压缩方法的核心是:通过识别每个8×8像素块中相邻像素中的重复像素来减少显示图像所需的位数,并使用近似估算法降低其冗余度
因此,我们可以把DCT看作一个用于执行压缩的近似计算方法。因为丢失了部分数据,所以DCT是一种有损压缩(Loss Compression)技术,但一般不会影响图像的视觉效果。
- 常见的隐写方法有JSteg、JPHide、Outguess、F5等等
Stegdetect
- 它可以检测到通过JSteg、JPHide、OutGuess、Invisible Secrets、F5、appendX和Camouflage等这些隐写工具隐藏的信息
- 具有基于字典暴力破解密码方法提取通过Jphide、outguess和jsteg-shell方式嵌入的隐藏信息
JPHS
软件里面主要包含了两个程序JPHIDE和JPSEEK
- JPHIDE程序主要是实现将信息文件加密隐藏到JPEG图像功能
- JPSEEK程序主要实现从用JPHIDE程序加密隐藏得到的JPEG图像探测提取信息文件
介绍了相关概念和两个工具,我们来看个例题
打开是
由于是jpg格式,我们先用Stegdetect查看一下是否存在JPG图片隐写
输入stegdetect.exe -tjopi -s 10.0 level4.jpg
存在JPHide隐写
在JPHS打开level4.jpg
点击seek
发现要密码
回到stegdetect,爆破密码
stegbreak.exe -r rules.ini -f password.txt level4.jpg
将爆出的密码输入后随便输入一个文件名即可得到隐写内容
这是一道套娃题,这里只是其中用到jpg隐写的部分
因为outguess隐写要用到虚拟机,所以启动了kali,结果发现网络不连通
ping baidu.com
发现ping不通
看了好几篇文章,终于解决了
先是发现启用联网没开,然后还是不行
后来看了这篇文章:https://blog.csdn.net/nanke_4869/article/details/123662430
还原了默认设置才解决
outguess
对于outguess方式嵌入隐藏信息的,直接在虚拟机使用outguess
具体命令:outguess (-k key) -r 图片名称 -t 保存的文件名称
比如这题
首先在图片所在的文件夹下打开终端
输入:outguess -r outguess.jpg -t 11.txt
打开11.txt,发现是乱码,在windows打开也一样
这里就需要在图片属性中找到key
修改指令为
outguess -k gUNrbbdR9XhRBDGpzz -r outguess.jpg -t 11.txt
F5-steganography
- 指令:java Extract Misc.jpg(图片名称) [-p password]可选项
- 自动会在当前文件夹下生成output.txt文件
这里需要知道所有的zip文件,都是以PK这两个字母开头的,可以使用记事本查看
将后缀改为zip即可
异或和盲水印
- 遇到相同的图片时可能是以下两种情况
- 异或 2. 盲水印
- 遇到两个酷似二维码的图片,可能是异或
- 解密工具:stegsolve,盲水印脚本,QR Research
- 例1:
使两个二维码图片结合
再使用QR Research解码成功 - 例2:
用010editor打开图片的16进制,没有发现信息
于是我们在kali中使用binwalk Heart.png查看有没有可分离的隐藏文件
发现有两张png
输入指令:foremost -T Heart.png
or binwalk -e Heart.png
亲测发现解出来的文件夹里的内容不一样,用foremost可以解出两张图片
这里有些许疑问,好像是binwalk分离的更细致
测试过不是盲水印,然后使用stegsolve拼接两张图片
这里也有盲水印的例题 - 注意:程序python2和python3版本的加解密结果会有所不同,主要原因是python2和python3 random的算法不同,如果要让python3兼容python2的random算法请加 –oldseed参数。
python bwmforpy3.py decode day1.png day2.png flag.png –oldseed
得到flag.png
绘制二维码
使用下面的脚本就行,修改str和MAX即可
1 | from PIL import Image |