ctf题集【BUUCTF MISC】[BJDCTF2020]一叶障目1

下载文件后解压,老规矩查看属性后扔010中,发现错误提示crc匹配错误,看来要修改宽高了。

网上找了个大佬的crc修复宽高的脚本:

import zlib
import struct
import argparse
import itertools

# parser = argparse.ArgumentParser()
# parser.add_argument("-f", type=str, default=None, required=True,
#                     help="输入同级目录下图片的名称")
# args = parser.parse_args()

bin_data = open('./1.png', 'rb').read()
crc32key = zlib.crc32(bin_data[12:29])  # 计算crc
original_crc32 = int(bin_data[29:33].hex(), 16)  # 原始crc

if crc32key == original_crc32:  # 计算crc对比原始crc
    print('宽高没有问题!')
else:
    input_ = input("宽高被改了, 是否CRC爆破宽高? (Y/n):")
    if input_ not in ["Y", "y", ""]:
        exit()
    else:
        for i, j in itertools.product(range(4095),
                                      range(4095)):  # 理论上0x FF FF FF FF,但考虑到屏幕实际/cpu,0x 0F FF就差不多了,也就是4095宽度和高度
            data = bin_data[12:16] + struct.pack('>i', i) + struct.pack('>i', j) + bin_data[24:29]
            crc32 = zlib.crc32(data)
            if (crc32 == original_crc32):  # 计算当图片大小为i:j时的CRC校验值,与图片中的CRC比较,当相同,则图片大小已经确定
                print(f"\nCRC32: {hex(original_crc32)}")
                print(f"宽度: {i}, hex: {hex(i)}")
                print(f"高度: {j}, hex: {hex(j)}")
                exit(0)

ctf题集【BUUCTF MISC】[BJDCTF2020]一叶障目1_第1张图片

使用后发现需要把宽高修改成0x141和0x34c,修改后成功显示flag

ctf题集【BUUCTF MISC】[BJDCTF2020]一叶障目1_第2张图片

学习总结下原理:

1.PNG图片的格式

ctf题集【BUUCTF MISC】[BJDCTF2020]一叶障目1_第3张图片
(1). png的文件头:8个字节 89 50 4E 47 0D 0A 1A 0A 为 png的文件头(固定)

(2). 4个字节 00 00 00 0D 十进制为13,代表头部数据块的长度为13

(3). 4个字节 49 48 44 52 ASCII码为IHDR,表明数据块为IHDR

(4). 13位数据块(IHDR)(红色线条部分)
前四个字节代表该图片的宽 00 00 01 FF(不固定,可变)
后四个字节代表该图片的高 00 00 01 FF(不固定,可变)
后五个字节依次为: Bit depth、ColorType、 Compression method、 Filter method、Interlace method(不固定,可变)

(5). 剩余四字节为该png的CRC检验码 59 F1 D4 BE,由从IDCH到THDR的十七位字节进行crc计算得到。(黄色线条的部分)

参考文章:【精选】CRC爆破png图片宽度和高度原理以及python代码_png crc计算-CSDN博客

你可能感兴趣的:(CTF,MISC,python,开发语言,安全)