深度理解压缩包伪加密
C3ngH Lv4

压缩包伪加密看似很简单,但其实网上绝大部分教程都没有讲明白,所以准备自己写一篇文章,以zip文件为主。

压缩包文件结构

根据ZIP 格式 - CTF Wiki,我们可以知道一个压缩包被分为三部分,分别为压缩源文件数据区 + 压缩源文件目录区 + 压缩源文件目录结束标志,对应010 Editor变量中的record + dirEntry + endLocator三部分。

image

文件源数据区(record)

HEX 数据 描述 010Editor 模板数据
50 4B 03 04 zip 文件头标记,看文本的话就是 PK 开头 char frSignature[4]
0A 00 解压文件所需 pkware 版本 ushort frVersion
00 00 全局方式位标记(有无加密) ushort frFlags
00 00 压缩方式 enum COMPTYPE frCompression
E8 A6 最后修改文件时间 DOSTIME frFileTime
32 53 最后修改文件日期 DOSDATE frFileDate
0C 7E 7F D8 CRC-32 校验 uint frCrc

文件目录区(dirEntry)

HEX 数据 描述 010Editor 模板数据
50 4B 01 02 目录中文件文件头标记 char deSignature[4]
3F 00 压缩使用的 pkware 版本 ushort deVersionMadeBy
0A 00 解压文件所需 pkware 版本 ushort deVersionToExtract
00 00 全局方式位标记(有无加密) ushort deFlags
00 00 压缩方式 enum COMPTYPE frCompression
E8 A6 最后修改文件时间 DOSTIME frFileTime
32 53 最后修改文件日期 DOSDATE frFileDate
0C 7E 7F D8 CRC-32 校验 uint frCrc

文件目录结束(endLocator)

50 4B 05 06 目录结束标记 char elSignature[4]
00 00 当前磁盘编号 ushort elDiskNumber
00 00 目录区开始磁盘编号 ushort elStartDiskNumber

record区的frFlags和dirEntry区deFlags两个位置为奇数时为加密状态,偶数时为未加密状态。

实现伪加密

正常情况下并没有伪加密需求(大概没吧),但在CTF比赛中,出题人可能会人为的将record和dirEntry两个区的加密标志位修改成加密状态,实现伪加密。所以只需要把frFlagsdeFlags修改为奇数即可。

那么恢复也只需要修改这两位为偶数即可。

解压软件如何判断是否加密

经过实测,7-Zip检测record区的frFlags位,其他解压软件,例如BandZip和WinRAR检测dirEntry区的deFlags位,这三种软件都只检测一位,并不会检测另一个位置,同时也不会进行报错。

解压工具 检测位置
BandZip deFlags
WinRAR deFlags
7-Zip frFlags

**注意:**据群友所述,2345好压是一个很神奇的软件,它会默认将加密的Zip先按照无加密尝试一次,如果成功解压则直接解压,如果解压失败再输入密码,所以似乎天生对伪加密有抗性?真正的一把梭工具,但是真实性自行验证,我不太想让我的电脑沾上好压。

一把梭工具如何判断是否加密

随波逐流

经测试高版本随波逐流(指支持解伪加密的版本)默认检测的是record区的deFlags位。

PuzzleSolver Pro

待测试…

 评论
评论插件加载失败
正在加载评论插件
总字数 87.1k 访客数 访问量