题解
拿到一张png图片,CRC值不对,需要修改宽高比
爆破修复
查看output.png
获得flag
flag
flag{66666}
检验CRC
import binascii
import struct
import argparse #接收参数模块
# 创建 ArgumentParser 对象
parser = argparse.ArgumentParser(description='校验CRC脚本参数说明')
# 添加需要接收的参数
parser.add_argument('-f', type=str, help='文件名')
# 解析命令行参数
args = parser.parse_args()
# 开始读取图片内容
crc_f = open(f"{args.f}", "rb").read() #打开图片
crc_key = int(crc_f[29:33].hex(),16) #读取图片中的CRC校验值
print(f"图片CRC校验值:{crc_key}")
#计算CRC
data = crc_f[12:29]
crc32 = binascii.crc32(data) & 0xffffffff
print(f"CRC计算值:{crc32}")
if(crc32 == crc_key): #比较CRC计算值和图片的校验值是否一致,不相等说明宽高比异常
print("图片宽高比正常")
elif(crc32 != crc_key):
print("图片CRC校验失败,宽高比异常")
修复CRC
import binascii
import struct
import argparse #接收参数模块
# 创建 ArgumentParser 对象
parser = argparse.ArgumentParser(description='修复CRC脚本参数说明')
# 添加需要接收的参数
parser.add_argument('-f', type=str, help='文件名')
# 解析命令行参数
args = parser.parse_args()
crc_f = open(f"{args.f}", "rb").read() #打开图片
crc_key = int(crc_f[29:33].hex(),16) #读取图片中的CRC校验值
print(f"图片CRC校验值:{crc_key}")
for i in range(4294): # 4294967295 四位数就够了
for j in range(4294):
data = crc_f[12:16]+struct.pack('>i', i)+struct.pack('>i', j)+crc_f[24:29]
crc32 = binascii.crc32(data) & 0xffffffff
#print(f"当前爆破CRC计算值:{crc32}")
if(crc32 == crc_key): #CRC计算值与校验值相同,宽高比爆破完成
print(f"当前宽高比CRC计算值:{crc32}")
print(f"宽 {i} , 高 {j}")
print('hex:', hex(i), hex(j))
#爆破完成,重新生成写入
new_f = bytearray(crc_f)
new_f[16:20] = struct.pack('>i', i) # 宽
new_f[20:24] = struct.pack('>i', j) # 高
f = open('output.png','wb') #写入保存
f.write(new_f)
f.close
标签:crc,校验,一叶障目,CRC,key,print,crc32
From: https://www.cnblogs.com/GaolengDeKecy/p/17917601.html