CTF类题目复现总结-[MRCTF2020]ezmisc 1

发布于:2025-03-30 ⋅ 阅读:(29) ⋅ 点赞:(0)

一、题目地址

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!}

在这里插入图片描述