图片隐写

misc图片隐写

misc图片隐写

高度、宽度隐写

常见表达形式为:修改一个图片的长宽使一张图片显示不完整从而达到隐藏信息的目的。

图片可以正常显示,但是拖到010 Editor中会显示CRC报错,此时就说明图片的高度被修改了,我们可以通过以下方式方式还原。

高度隐写

方法:直接修改

基础知识:png图片各字段意思

yin1

1.(固定)八个字节89 50 4E 47 0D 0A 1A 0A为png的文件头

2.(固定)四个字节00 00 00 0D代表数据块的长度为13

3.(固定)四个字节49 48 44 52(即为ASCII码的IHDR)是文件头数据块的标示

4.(可变)13位数据块(IHDR)

​ - 前四个字节代表该图片的宽----00 00 02 A7--由图片实际宽度决定

​ - 后四个字节代表该图片的高----00 00 01 DF--由图片实际高度决定

​ - 后五个字节依次用来补充13位长度

5.(可变)剩余四字节为该png的CRC检验码,由从IDCH到IHDR的十七位字节进行crc计算得到

修改

ooo

可以看出高度值很小 我们直接调大就可以

kkk

然后 ctrl+s保存

再次打开图片就得到了flag

image-20230109050956410

宽度隐写

宽度隐写不能直接修改 需要借助脚本进行修改

import os
import binascii
import struct


misc = open("misc4.png","rb").read()

for i in range(1024):
    data = misc[12:16] + struct.pack('>i',i)+ misc[20:29]
    crc32 = binascii.crc32(data) & 0xffffffff
    if crc32 == 0x932f8a6b:
        print i

或者一个全都能改的脚本

import zlib
import struct
import argparse
import itertools


parser = argparse.ArgumentParser()
parser.add_argument("-f", type=str, default=None, required=True,
                    help="输入同级目录下图片的名称")
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)

LSB隐写

LSB 全称 Least Significant Bit,最低有效位。PNG 文件中的图像像数一般是由 RGB 三原色(红绿蓝)组成,每一种颜色占用 8 位,取值范围为 0x000xFF,即有 256 种颜色,一共包含了 256 的 3 次方的颜色,即 16777216 种颜色。

而人类的眼睛可以区分约 1000 万种不同的颜色,意味着人类的眼睛无法区分余下的颜色大约有 6777216 种。

LSB 隐写就是修改 RGB 颜色分量的最低二进制位(LSB),每个颜色会有 8 bit,LSB 隐写就是修改了像数中的最低的 1 bit,而人类的眼睛不会注意到这前后的变化,每个像素可以携带 3 比特的信息。

img

工具介绍

Stegsolve

Analyse

  • File Format:文件格式
  • Data Extract:数据提取
  • Steregram Solver:立体视图 可以左右控制偏移
  • Frame Browser:帧浏览器
  • Image Combiner:拼图,图片拼接

使用

File Format

Format.png

如上图,该功能会显示图片的具体信息

Data Extract

Extract.png

左边的4行是Alpha(透明度)和RGB值的通道,数字越大,表示相应颜色亮度越高

例题

cyberpunk

用Data Extract功能 调整一下

image-20230109065622754

我们可以直接导出来flag了

posted @ 2023-01-09 07:13  ZJFAKE  阅读(788)  评论(0)    收藏  举报