CTF实战:从ZIP伪加密到二进制文件结构解析

CTF实战:从ZIP伪加密到二进制文件结构解析 1. ZIP伪加密CTF中的经典陷阱第一次参加CTF比赛时我遇到一个看似简单的MISC题目——解压一个加密的ZIP文件。当时我花了整整两小时尝试各种密码爆破工具直到队友提醒我这可能是伪加密。这个经历让我深刻认识到在CTF竞赛中ZIP伪加密是最常见的障眼法之一。所谓伪加密就是文件实际上没有加密但通过修改ZIP文件结构的特定标记位让解压软件误以为需要密码。这种手法在BUUCTF等知名赛事中频繁出现比如经典的11.zip伪加密题目。与真正的加密不同伪加密不需要破解密码只需要找到并修改关键字节即可。理解伪加密的关键在于掌握ZIP文件的二进制结构。每个ZIP文件都包含三个核心部分压缩源文件数据区Local File Header存储实际文件数据压缩源文件目录区Central Directory相当于文件索引目录结束标志End of Central Directory标记文件结束2. 解剖ZIP文件二进制结构详解2.1 用010 Editor打开ZIP文件工欲善其事必先利其器。分析二进制文件我首推010 Editor它不仅能十六进制查看还内置了ZIP文件模板。打开文件后你会看到类似这样的结构50 4B 03 04 14 00 00 00 08 00 5A 7E F7 46这串看似随机的十六进制代码其实是ZIP文件的DNA。让我们拆解前几个关键字节50 4B 03 04固定文件头标识小端序为0x04034b5014 00解压所需的最低PKWARE版本00 00全局方式位标记加密判断关键08 00压缩方式如DEFLATE2.2 关键加密标记位真正决定是否加密的是全局方式位标记General Purpose Bit Flag。在数据区和目录区都有这个标记但它们的组合方式不同加密类型数据区标记目录区标记实际状态无加密00 0000 00直接可解压伪加密00 0009 00假加密需修改真加密09 0009 00需密码破解特别注意只有第二个字节的奇偶性决定加密状态。例如09 00奇数表示加密00 00偶数表示未加密3. 实战破解从识别到修复3.1 识别伪加密特征拿到一个ZIP文件时我通常会先用binwalk检查binwalk可疑文件.zip如果显示Zip archive data但无法直接解压就可能遇到伪加密。这时用010 Editor打开重点查看两个位置数据区起始位置后第6-7字节紧接50 4B 03 04 14 00目录区起始位置后第8-9字节紧接50 4B 01 02 1F 00 14 003.2 手动修改字节实战以BUUCTF的11.zip伪加密为例操作步骤如下在010 Editor中搜索十六进制序列50 4B 01 02向后定位到第8-9字节通常显示为09 00将09 00修改为00 00保存文件后直接解压我曾遇到过更隐蔽的变种题目录区标记是0B 00。原理相同——只要把第二个字节从奇数改为偶数即可如0B→0A。4. 深入理解ZIP文件结构全解析4.1 数据区Local File Header这是文件实体存储区域结构如下50 4B 03 04 [版本] [标记位] [压缩方式] [时间戳] [日期戳] [CRC] [压缩大小] [未压缩大小] [文件名长度] [额外字段长度] [文件名] [额外字段] [文件数据]关键字段说明时间戳5A 7E表示18:45:30日期戳F7 46表示2023-11-15CRC文件校验值4.2 目录区Central Directory相当于文件系统的目录表结构更复杂50 4B 01 02 [创建版本] [解压版本] [标记位] [压缩方式] [时间戳] [日期戳] [CRC] [压缩大小] [未压缩大小] [文件名长度] [额外字段长度] [文件注释长度] [磁盘号] [内部属性] [外部属性] [相对偏移] [文件名] [额外字段] [注释]4.3 目录结束标志EOCD标记文件结束包含重要元信息50 4B 05 06 [当前磁盘号] [目录开始磁盘] [本磁盘记录数] [总记录数] [目录大小] [目录偏移] [注释长度] [注释]5. 进阶技巧与常见陷阱5.1 自动化识别脚本虽然手动修改可行但比赛中时间宝贵。我常用这个Python脚本快速检测伪加密import zipfile def check_fake_encryption(zip_path): with open(zip_path, rb) as f: data f.read() # 查找目录区标记 cd_pos data.rfind(bPK\x01\x02) if cd_pos -1: return False # 检查目录区加密标记 flag_byte data[cd_pos 8] return (flag_byte 1) 1 and data.find(bPK\x03\x04\x14\x00\x09\x00) -15.2 常见变种题型双重伪加密数据区和目录区都标记为加密但实际未加密部分加密ZIP内部分文件真加密部分伪加密结构损坏故意破坏文件结构增加修复难度5.3 其他工具链推荐hexdumpLinux下快速查看十六进制hexdump -C 可疑文件.zip | head -n 20zipdetails专业分析ZIP结构zipdetails -v 可疑文件.zip7z有时能绕过伪加密检测7z x 可疑文件.zip在CTF比赛中ZIP类题目往往只是开始。掌握文件结构分析技术后你可以进一步挑战更复杂的文件格式分析如PNG结构解析、PDF流对象处理等。每次比赛我都会收集各类文件结构的脑图这些经验最终形成了我的二进制文件分析手册