2026.7.13(3)【图片隐写】大白

📌 题目信息

项目内容
题目名称大白
题目来源BUUCTF
题目类型MISC / 图片隐写
子分类PNG高度隐写
考点PNG文件格式、修改图片高度、CRC校验
难度⭐⭐
最终 Flagflag{He1l0_d4_ba1}


🛠️ 使用工具

  • 010 Editor / WinHex (十六进制编辑器)
  • Python(CRC爆破,可选)

📝 解题思路

题目描述为“看不到图?是不是屏幕太小了”。打开图片后会发现图片显示不完整,只有上半部分。这是因为出题人故意修改了PNG图片的高度值,导致下半部分被截断,而Flag就藏在被截掉的部分里。

解题的核心就是:用十六进制编辑器打开图片,找到PNG的高度字段,将其修改为正确的值(通常改为与宽度一致),保存后即可看到完整的Flag


第 1 步:观察图片异常

下载附件解压后得到 dabai.png,打开后发现图片明显显示不全,缺少下半部分

题目提示“屏幕太小了”进一步印证了猜测:图片的高度被人为改小了,Flag就藏在被截掉的部分里。


第 2 步:用十六进制编辑器打开图片

010 Editor(或 WinHex、HxD)打开 dabai.png

PNG文件格式基础知识

PNG图片的文件头结构如下:

位置内容说明
第1-8字节89 50 4E 47 0D 0A 1A 0APNG文件头固定标识
第9-12字节00 00 00 0DIHDR数据块长度(13字节)
第13-16字节49 48 44 52IHDR标识(ASCII码为"IHDR")
第17-20字节00 00 02 A7图片宽度(4字节)
第21-24字节00 00 01 00图片高度(4字节)
第25-29字节08 06 00 00 00图像信息(位深、颜色类型等)
第30-33字节4字节CRC校验码由前面17字节数据计算得出

图片尺寸为 宽 787 像素 × 高 256 像素。正常图片的高度应该与宽度相近(甚至更大),而这里高度明显过小,导致图片显示不全。


第 3 步:修改图片高度

将高度值 00 00 01 00(十进制 256)修改为与宽度一致的值 00 00 02 A7(十进制 679)。

操作步骤:

  1. 在十六进制编辑器中定位到第 21-24 字节(即 00 00 01 00)。
  2. 将其修改为 00 00 02 A7
  3. 保存文件。

    ⚠️ 注意:如果修改高度后图片显示异常(花屏),说明CRC校验失败。此时需要用Python脚本爆破CRC,找到正确的高度值。(详见下方“进阶技巧”)


第 4 步:查看修改后的图片

保存后重新打开图片,可以看到图片被拉长,完整的Flag显示在图片下方


🏁 最终 Flag

flag{He1l0_d4_ba1}

⚠️ 注意:Flag中的 He1l0数字1而非字母 ld4 中是数字4而非字母 a


🔧 进阶技巧:CRC爆破

如果直接修改高度后图片无法正常显示(花屏或报错),说明CRC校验不匹配。此时需要用Python脚本爆破正确的高度值:

import os
import binascii
import struct

crcbp = open("dabai.png", "rb").read()

for i in range(2000):      # 宽度爆破范围
    for j in range(2000):  # 高度爆破范围
        data = crcbp[12:16] + struct.pack('>i', i) + struct.pack('>i', j) + crcbp[24:29]
        crc32 = binascii.crc32(data) & 0xffffffff
        if crc32 == 0xda5a4a50:  # 替换为图片实际的CRC值
            print("width:", i, "height:", j)
            print("hex:", hex(i), hex(j))

运行后得到正确的宽高值,再将其填入十六进制编辑器即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值