📌 题目信息
| 项目 | 内容 |
|---|---|
| 题目名称 | 大白 |
| 题目来源 | BUUCTF |
| 题目类型 | MISC / 图片隐写 |
| 子分类 | PNG高度隐写 |
| 考点 | PNG文件格式、修改图片高度、CRC校验 |
| 难度 | ⭐⭐ |
| 最终 Flag | flag{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 0A | PNG文件头固定标识 |
| 第9-12字节 | 00 00 00 0D | IHDR数据块长度(13字节) |
| 第13-16字节 | 49 48 44 52 | IHDR标识(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)。
操作步骤:
- 在十六进制编辑器中定位到第 21-24 字节(即
00 00 01 00)。 - 将其修改为
00 00 02 A7。 - 保存文件。
⚠️ 注意:如果修改高度后图片显示异常(花屏),说明CRC校验失败。此时需要用Python脚本爆破CRC,找到正确的高度值。(详见下方“进阶技巧”)
第 4 步:查看修改后的图片
保存后重新打开图片,可以看到图片被拉长,完整的Flag显示在图片下方。
🏁 最终 Flag
flag{He1l0_d4_ba1}
⚠️ 注意:Flag中的
He1l0是数字1而非字母l;d4中是数字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))
运行后得到正确的宽高值,再将其填入十六进制编辑器即可。
【图片隐写】大白&spm=1001.2101.3001.5002&articleId=163482352&d=1&t=3&u=0fbf8893e4984f8ba42eb99df9acb566)
53

被折叠的 条评论
为什么被折叠?



