WP BUUCTF 大白

题目链接: https://buuoj.cn/challenges#%E5%A4%A7%E7%99%BD

题目

看不到图? 是不是屏幕太小了 注意:得到的 flag 请包上 flag{} 提交

思路

题目中提到了看不到图以及屏幕太小了,再加上题目给了一张 png 图片,由此可以猜到这题修改了图片的长或宽,让设备只能显示图片的一部分,从而隐藏了 flag
使用脚本

import zlib
import struct

filename = '2.png'
with open(filename, 'rb') as f:
    all_b = f.read()
    crc32key = int(all_b[29:33].hex(), 16)
    data = bytearray(all_b[12:29])
    n = 4095  # 理论上0xffffffff,但考虑到屏幕实际/cpu,0x0fff就差不多了
    for w in range(n):  # 高和宽一起爆破
        width = bytearray(struct.pack('>i', w))  # q为8字节,i为4字节,h为2字节
        for h in range(n):
            height = bytearray(struct.pack('>i', h))
            for x in range(4):
                data[x + 4] = width[x]
                data[x + 8] = height[x]
            crc32result = zlib.crc32(data)
            if crc32result == crc32key:
                # 2021.7.20,有时候显示的宽高依然看不出具体的值,干脆输出data部分
                print(data.hex())
                print("宽为:", end="")
                print(width)
                print("高为:", end="")
                print(height)
                exit(0)

可以一键得出图片正确的长和宽,将图片信息修改为正确的长和宽即可看到 flag
img1

可得 flag 为 flag{He1l0_d4_ba1}


之前用的脚本咋找不到了呢…



最后修改于 2023-01-14