头尾标识与修复指南)
CTF 文件隐写与修复5种常见文件格式PNG/ZIP/GIF/DOCX/RAR头尾标识与修复指南在CTF竞赛的杂项Misc类别中文件隐写与修复是高频考点之一。本文将深入解析PNG、ZIP、GIF、DOCX和RAR这五种常见文件格式的结构特征提供详细的文件头尾标识速查表并给出实用的手动修复方法与Python自动化脚本。1. 文件结构基础与关键字节解析理解文件格式的底层结构是识别和修复异常文件的前提。每种文件都有特定的文件头Magic Number和文件尾标识这些字节序列如同文件的指纹。1.1 文件头尾速查表文件格式文件头Hex文件尾Hex关键结构特征PNG89 50 4E 47 0D 0A00 00 00 00 49 45包含IHDR块含宽高和CRC校验ZIP50 4B 03 0450 4B 05 06中央目录记录标记伪加密位GIF47 49 46 3800 3B多帧存储可分离查看DOCX50 4B 03 0450 4B 05 06实质为ZIP压缩包RAR52 61 72 21 1AC4 3D 7B 00版本标识影响文件头结构注意RAR5格式版本5的文件头为52 61 72 21 1A 07 00与旧版不同1.2 文件异常类型分析CTF中常见的文件异常包括文件头/尾损坏或缺失人为删除或替换关键字节CRC校验错误修改宽高但未更新校验值PNG伪加密ZIP文件目录区与数据区加密标志位不一致格式嵌套如图片内隐藏压缩包需binwalk分离2. PNG文件分析与修复PNG文件采用分块存储结构每个数据块包含长度、类型、数据和CRC校验四部分。IHDR块是第一个关键数据块存储图像宽高等元信息。2.1 CRC校验爆破宽高当IHDR块的CRC校验失败时可通过爆破获取原始宽高。以下Python脚本自动计算匹配的宽高值import zlib import struct def repair_png_dimensions(file_path): with open(file_path, rb) as f: data f.read() # 提取IHDR块数据偏移12-29字节 ihdr bytearray(data[12:29]) original_crc struct.unpack(I, data[29:33])[0] # 爆破范围设置建议±2000像素 for w in range(1, 2000): for h in range(1, 2000): # 替换宽高数据 new_width struct.pack(I, w) new_height struct.pack(I, h) ihdr[4:8] new_width ihdr[8:12] new_height # 计算CRC校验 crc zlib.crc32(ihdr) if crc original_crc: # 生成修复后的文件 repaired bytearray(data) repaired[16:20] new_width repaired[20:24] new_height with open(repaired.png, wb) as f: f.write(repaired) return w, h return None2.2 实战案例BUUCTF 一叶障目使用010 Editor打开图片发现IHDR块CRC错误运行上述脚本爆破得到正确宽高如321×332修改后图片显示完整二维码扫码得flag3. ZIP文件处理技巧ZIP文件由本地文件头文件数据中央目录记录组成伪加密通过修改加密标志位实现。3.1 伪加密识别与修复伪加密特征源文件区加密标志偏移位6-709 00目录区加密标志偏移位28-2900 00修复步骤用WinHex搜索50 4B 01 02中央目录头向后查找第8-9字节将09 00改为00 00保存后即可无密码解压3.2 Python自动化检测脚本import binascii def check_zip_encryption(file_path): with open(file_path, rb) as f: data f.read() # 查找中央目录记录 cd_record_pos data.find(bPK\x01\x02) if cd_record_pos -1: return Not a valid ZIP file # 检查加密标志位 global_enc_flag data[cd_record_pos8:cd_record_pos10] if global_enc_flag b\x00\x00: return No encryption elif global_enc_flag b\x09\x00: return Pseudo-encryption detected else: return True encryption4. GIF文件修复方法GIF文件由文件头逻辑屏幕描述符全局颜色表图像数据块组成。常见问题是文件头损坏或帧数据异常。4.1 文件头修复步骤用010 Editor打开损坏文件在文件起始位置插入缺失的GIF头47 49 46 38检查文件尾是否为00 3B保存后使用Stegsolve逐帧分析4.2 实战案例BJDCTF 鸡你太美发现篮球副本文件无法打开添加标准GIF文件头47 49 46 38 39 61修复后动图显示flag5. DOCX与RAR特殊处理5.1 DOCX文件本质分析DOCX实质是ZIP压缩包包含多个XML文件word/ document.xml - 主内容 media/ - 嵌入图片 comments.xml - 批注CTF解题技巧修改后缀为.zip后解压检查word/media/和word/comments.xml搜索xl/charts/Excel图表数据5.2 RAR文件修复RAR文件头损坏修复步骤确认版本RAR4或RAR5修复文件头RAR452 61 72 21 1A 07 00RAR552 61 72 21 1A 07 01 00使用WinRAR自带的修复功能6. 综合工具链推荐基础分析010 Editor模板解析binwalk文件分离fileLinux文件类型检测专项工具TweakPNGPNG校验修复ZIP CenOpZIP伪加密检测Stegsolve图片隐写分析Python库import zlib # CRC计算 import struct # 二进制打包 from PIL import Image # 图片处理提示所有操作前务必备份原文件避免不可逆损坏