1.IHDR隐写(宽高爆破)
文件头数据块(IHDR),它由第11——32字节组成(从0开始),包含有 PNG 文件中存储的图像数据的基本信息,数据从第 16字节开始,有13个字节,其前8字节分别用4个字节规定了图片的宽和高(十六进制,以像素为单位)。
首先知道png在十六进制文本编辑器里面的组成
(固定)八个字节89 50 4E 47 0D 0A 1A 0A为png的文件头
- (固定)四个字节00 00 00 0D(即为十进制的13)代表数据块的长度为13
- (固定)四个字节49 48 44 52(即为ASCII码的IHDR)是文件头数据块的标示(IDCH)
- (可变)13位数据块(IHDR)
- 前四个字节代表该图片的宽
- 后四个字节代表该图片的高
- 后五个字节依次为:
Bit depth、ColorType、Compression method、Filter method、Interlace method
- (可变)剩余四字节为该png的CRC检验码,由从IDCH到IHDR的十七位字节进行crc计算得到。
IHDR主要是图片宽高问题,下面是宽高爆破脚本
import zlib
import struct
import argparse
import itertools
parser = argparse.ArgumentParser()
parser.add_argument("-f", type=str, default=None, required=True,help="此处输入需要CRC爆破的同级目录下的图片名称")
args = parser.parse_args()
bin_data = open(args.f, 'rb').read()
crc32key = zlib.crc32(bin_data[12:29]) # 计算crc
original_crc32 = int(bin_data[29:33].hex(), 16) # 原始crc
if crc32key == original_crc32: # 计算crc对比原始crc
print('宽高没有问题!')
else:
input_ = input("宽高被改了, 是否CRC爆破宽高? (Y/n):")
if input_ not in ["Y", "y", ""]:
exit()
else:
for i, j in itertools.product(range(4095), range(4095)): # 理论上0x FF FF FF FF,但考虑到屏幕实际/cpu,0x 0F FF就差不多了,也就是4095宽度和高度
data = bin_data[12:16] + struct.pack('>i', i) + struct.pack('>i', j) + bin_data[24:29]
crc32 = zlib.crc32(data)
if(crc32 == original_crc32): # 计算当图片大小为i:j时的CRC校验值,与图片中的CRC比较,当相同,则图片大小已经确定
print(f"\nCRC32: {hex(original_crc32)}")
print(f"宽度: {i}, hex: {hex(i)}")
print(f"高度: {j}, hex: {hex(j)}")
exit(0)
使用方法 :
2.LSB隐写
1.简介
全称为Least Significant Bit,在二进制数中意为最低有效位,一般来说,MSB(最高有效位)位于二进制数的最左侧,LSB位于二进制数的最右侧。比如一种颜色,用8位的二进制表示为:00100011,那么最左侧的0所在的位置,就是最高有效位MSB,最右侧的1所在的位置,就是最低有效位LSB。
由于图像的每一个像素点都是由RGB(红、绿、蓝)三原色组成,可以暂时称其为颜色通道,如果每个颜色通道的值占8位,那么RGB色彩模式的图片中,每个像素点的颜色就可以用6位长度的十六进制数来(如#FFFFFF),LSB隐写即是修改每个颜色通道的最低一位,将其替换为我们想要嵌入的信息中的内容,以此来实现数据隐藏。因为是最低有效位,所以对实际的颜色影响不大,肉眼几乎分辨不出区别。
一个像素点包含三种颜色,每个颜色修改最后1位,这样一个像素点就可以携带3位信息
应用LSB算法的图像格式需为位图形式,即图像不能经过压缩,如LSB算法多应用于png、bmp等格式,而jpg格式较少。
3.常用工具
1.Stegslove
File Format:文件格式
Data Extract:数据提取
Steregram Solve:立体试图 可以左右控制偏移
Frame Browser:帧浏览器
Image Combiner:拼图,图片拼接
2.ztseg工具使用
1.查看lsb数据
zsteg xxx.bmp
zsteg xxx.png
zsteg -a (文件名) #查看各个通道的lsb
2.检测zlib
#-b的位数是从1开始的
zsteg zlib.bmp -b 1 -o xy -v
3.提取该通道图片
zsteg -e b8,a,lsb,xy 文件.png -> out.png
3.steghide
使用命令
将隐藏信息从载体中分离出来
steghide extract -sf test.jpg -p 123456
#-sf 参数
#test.jpg 图片名称
#-p 密码参数,后面空格跟密码,无密码可不加参数,回车就好
将文件隐藏到载体中
steghide embed -cf test.jpg -ef secret.txt -p 123456
爆破密码
如果没有得到密码的话,也可以爆破得到密码,有两种方法