侧边栏壁纸
博主头像
Fup1p1 's Blog 博主等级

梦想是财富自由~

  • 累计撰写 38 篇文章
  • 累计创建 24 个标签
  • 累计收到 9 条评论

目 录CONTENT

文章目录

【Misc】 根据CRC码矫正PNG图片宽高

Fup1p1
2022-05-01 / 0 评论 / 0 点赞 / 802 阅读 / 0 字 / 正在检测是否收录...

CRC简介

循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。

图片隐写中的运用

发现CRC错误

QQ截图20220501165740
这张图片宽高就不对劲,像是被截断一样。
此时,我们就可以根据CRC来判断这个图片的宽高是否被修改。
先放入010Editor进行分析。
QQ截图20220501170308
左下角已经弹出CRC错误,很明显,宽高被修改了,可能藏有信息。

如何正确的修改宽和高呢?

我们先了解CRC32的结构

(固定)PNG文件中总是以固定的八个字节开头

89 50 4E 47 0D 0A 1A 0A

(固定)四个字节 (即为十进制的13)代表数据块的长度为13

00 00 00 0D

文件头数据块标示(IDCH)

49 48 44 52

13位数据块(IHDR)

00 00 02 A7 00 00 01 00 08 06 00 00 00
其中
00 00 02 A7 为宽
00 00 01 00 为高
08 06 00 00 00 这5个字节依次为Bit depth,ColorType,Compression method,Filter method,Interlace method

接下来的四字节为该PNG图片的CRC校验码
CRC校验码(由IDCH和IHDR共十七位字节进行crc计算得到)

6D 7C 71 35

编写脚本

import struct
import zlib

def hexStr2bytes(s):
    b = b""
    for i in range(0,len(s),2):
        temp = s[i:i+2]
        b +=struct.pack("B",int(temp,16))
    return b

str1="49484452" #(IDCH)
str2="0806000000" #(IHDR)的后五位字节
bytes1=hexStr2bytes(str1)
bytes2=hexStr2bytes(str2)
wid,hei = 679,256 #图片的宽、高

crc32 = "0x6d7c7135" #填入CRC校验码

for w in range(wid,wid+2000):
    for h in range(hei,hei+2000):
        width = hex(w)[2:].rjust(8,'0')
        height = hex(h)[2:].rjust(8,'0')
        bytes_temp=hexStr2bytes(width+height)
        if eval(hex(zlib.crc32(bytes1+bytes_temp+bytes2))) == eval(crc32):
            print(hex(w),hex(h))

运行脚本,得到正确的宽高

QQ截图20220501171957
比对后发现果然是高被修改了,我们填入正确的高,然后保存。
QQ截图20220501172024

得到可爱的大白✿✿ヽ(°▽°)ノ✿

dabai-1651396844454

0

评论区