misc-图片隐写

基于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即可

异或和盲水印

  • 遇到相同的图片时可能是以下两种情况
  1. 异或 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
2
3
4
5
6
7
8
9
10
11
12
13
14
from PIL import Image
MAX = 60 #二维码长宽
pic = Image.new("RGB",(MAX, MAX))
str = "str" #二进制数据
i=0
for y in range (0,MAX):
for x in range (0,MAX):
if(str[i] == '1'):
pic.putpixel([x,y],(0, 0, 0))
else:
pic.putpixel([x,y],(255,255,255))
i = i+1
pic.show()
#pic.save("flag.png")