Misc_PNG高宽详解

01.前言

在misc的类型题中,经常出现png图片可以打开,但是画面一篇混乱的情况

通常这种情况就是png图片的宽度被修改了,在png中修改宽度会导致图片一片混乱

我们可以使用以下两种方法将图片修改为正确宽高

02.crc爆破

在png宽度错误的题型中一般都为通过crc爆破的方式来获取真实宽高

02.1判断是否为crc爆破方法的小方法:

02.1.1使用pngcheck检查

02.1.2把图片拖到Linux里面,crc正确但宽高不正常的图片无法打开

02.2crc爆破

我们可以通过以下的python2脚本进行爆破宽度

# -*- coding: utf-8 -*-
import struct
import binascii
import os
def check(n):
    with open("1.png","rb") as fw:
        m=fw.read()
    data=bytearray(m)
    for i in range(n):
        weight = struct.pack('>i', i)
        for j in range(n):
            height = struct.pack('>i', j)
            # print m[12:16]
            c = m[12:16] + weight + height + m[24:29]
            crc = binascii.crc32(c) & 0xffffffff
            # print crc
            crckey=m[29:33].encode('hex')
            # print crckey
            if crc == int(crckey,16):
                print "weight:"+''.join(map(lambda c: "%02X" % ord(c),weight))
                print "height:"+''.join(map(lambda c: "%02X" % ord(c),height))
                data[16:20]=weight
                data[20:24]=height
                return data
if __name__ == '__main__':
    with open('flag.png','wb') as f:
        f.write(check(1024))

# import binascii
# import struct
# #\x49\x48\x44\x52\x00\x00\x01\xF4\x00\x00\x01\xA4\x08\x06\x00\x00\x00
# crc32key = 0xF37A5E12
# def check(n):
#     for i in range(0, n):
#         height = struct.pack('>i', i)
#         #CRC: CBD6DF8A
#         for j in range(0,n):
#             weight=struct.pack('>i', j)
#             data = '\x49\x48\x44\x52'+weight + height + '\x08\x02\x00\x00\x00'
#             crc32result = binascii.crc32(data) & 0xffffffff
#             if crc32result == crc32key:
#                 print "weight:"+''.join(map(lambda c: "%02X" % ord(c),weight))
#                 print "height:"+''.join(map(lambda c: "%02X" % ord(c),height))
#                 return
#     return
# check(4096)

python3脚本


import struct
import  binascii
import os
 
fi=open('1.png','rb').read()
 
#12-15字节代表固定的文件头数据块的标示,16-19字节代表宽度,20-23字节代表高度,24-28字节分别代表
# Bit depth、ColorType、Compression method、Filter method、Interlace method
#29-32字节为CRC校验和
 
for i in range(10000):#宽度0-9999搜索
    data=fi[12:16]+struct.pack('>I',i)+fi[20:29]  #pack函数将int转为bytes,>表示大端00 00 00 02,I表示4字节无符号int;<表示小端 02 00 00 00
    crc=binascii.crc32(data)&0xffffffff #byte的大小为8bits而int的大小为32bits,转换时进行与运算避免补码问题0x932f8a6b
    if crc==struct.unpack('>I',fi[29:33])[0]&0xffffffff : #解开为无符号整数
        print(i)

03.GIMP修复宽高

随着题目难度加深,出题人会修改crc以防止crc脚本爆破

这时候传统脚本已经失去作用,这时候可以采用GIMP修复宽高的方法修复图片

03.1使用脚本获取png的data数据

python3脚本 

#这里直接提取三给zlib //python3
import re,os
import zlib
c=re.sub(b'........IDAT',b'',open('1.png','rb').read,0,re.S)
#替换字符,去掉IDAT头这里的re.S表示让'.'特色字符匹配任何字符,包括换行符
c=re.sub(b'........IEND....',b'',c,0,re.S)
#替换字符,去掉IEND尾
count=0
zlibhead=b'x\x9c\xdc\xbd'
#zlib头,注意不要重复
for i in c.split(zlibhead)[1:]:     #从1开始是为了丢弃png signature
    open('flag'+str(count)+'.data','wb').write(zlib.decompress(zlibhead+i))
    count=count+1

脚本会生成一个flag.data文件来写入data数据

03.2 使用GIMP打开

GIMP下载参考链接:GIMP中文版官方下载-GIMP抠图软件免费下载-PC下载网 (pcsoft.com.cn)

将data文件拖入GMIP后

 将图像类型选择 RGB Alpha

 后通过调整宽度,来修复成大致可以看清楚字体的样子

记录宽度,然后放入010编辑器中修改宽度即可

04.暴力破解

如果crc爆破无果就且觉得GMIP方法太麻烦

就可以采用暴力破解的方式进行尝试宽高

这里选择风二西的png图片宽高一把梭的工具

真男人都是选择一把梭,梭哈是一种艺术

 工具获取方法关注一下bilibili风二西拿吧

blog:hehanzzz.com

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hehanzzz!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值