在misc的类型题中,经常出现png图片可以打开,但是画面一篇混乱的情况
通常这种情况就是png图片的宽度被修改了,在png中修改宽度会导致图片一片混乱
我们可以使用以下两种方法将图片修改为正确宽高
在png宽度错误的题型中一般都为通过crc爆破的方式来获取真实宽高
02.1.1使用pngcheck检查
02.1.2把图片拖到Linux里面,crc正确但宽高不正常的图片无法打开
我们可以通过以下的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)
随着题目难度加深,出题人会修改crc以防止crc脚本爆破
这时候传统脚本已经失去作用,这时候可以采用GIMP修复宽高的方法修复图片
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数据
GIMP下载参考链接:GIMP中文版官方下载-GIMP抠图软件免费下载-PC下载网 (pcsoft.com.cn)
将data文件拖入GMIP后
将图像类型选择 RGB Alpha
后通过调整宽度,来修复成大致可以看清楚字体的样子
记录宽度,然后放入010编辑器中修改宽度即可
如果crc爆破无果就且觉得GMIP方法太麻烦
就可以采用暴力破解的方式进行尝试宽高
这里选择风二西的png图片宽高一把梭的工具
真男人都是选择一把梭,梭哈是一种艺术
工具获取方法关注一下bilibili风二西拿吧
blog:hehanzzz.com