一、题目地址
https://buuoj.cn/challenges#[MRCTF2020]ezmisc
二、复现步骤
1、下载附件,得到一张图片;
2、利用010 Editor打开图片,提示CRC值校验错误,flag.png应该是宽和高被修改了,导致flag被隐藏掉;
如果打开未提示,可能是未安装PNG格式的模板,参考下面文章:
https://blog.csdn.net/weixin_42487326/article/details/146095231
010 Editor破解教程,参考下面文章:
https://blog.csdn.net/weixin_42487326/article/details/146184889
3、利用python脚本爆破图片的正确宽和高;
import os
import binascii
import struct
def get_png_crc(filename):
"""获取PNG图片IHDR块的CRC值"""
with open(filename, "rb") as f:
data = f.read()
ihdr_start = data.index(b'IHDR') # 找到IHDR块
crc_bytes = data[ihdr_start + 17: ihdr_start + 21] # CRC是IHDR后17-20字节
return int.from_bytes(crc_bytes, byteorder='big')
def brute_force_png_dimensions(filename, target_crc=None):
"""暴力破解PNG图片的正确尺寸"""
crcbp = open(filename, "rb").read()
# 如果没有提供目标CRC,则自动从文件中提取
if target_crc is None:
target_crc = get_png_crc(filename)
print(f"目标CRC值: 0x{target_crc:08X}")
print("开始暴力破解...")
for i in range(2000):
for j in range(2000):
# 构造IHDR块数据(不包括长度字段)
data = crcbp[12:16] + \
struct.pack('>i', i) + struct.pack('>i', j) + crcbp[24:29]
crc32 = binascii.crc32(data) & 0xffffffff
if crc32 == target_crc:
print(f"找到匹配的尺寸: 宽度={i}, 高度={j}")
print(f"十六进制: 宽度=0x{i:X}, 高度=0x{j:X}")
return (i, j)
print("在指定范围内未找到匹配的尺寸")
return None
# 使用示例
if __name__ == "__main__":
png_file = "flag.png"
# 自动获取CRC并开始破解
brute_force_png_dimensions(png_file)
个人总结CTF相关工具:https://github.com/huan-cdm/ctf_tools/
4、010 Editor打开flag.png文件,修改宽和高;
宽度:第19个字节开始
高度:第23个字节开始
宽度修改为:01F4
高度修改为:01C8
保存,得到flag
flag{1ts_vEryyyyyy_ez!}