深度理解压缩包伪加密

压缩包伪加密看似很简单,但其实网上绝大部分教程都没有讲明白,所以准备自己写一篇文章,以zip文件为主。
压缩包文件结构
根据ZIP 格式 - CTF Wiki,我们可以知道一个压缩包被分为三部分,分别为压缩源文件数据区 + 压缩源文件目录区 + 压缩源文件目录结束标志,对应010 Editor变量中的record + dirEntry + endLocator三部分。
文件源数据区(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两个区的加密标志位修改成加密状态,实现伪加密。所以只需要把frFlags
和deFlags
修改为奇数即可。
那么恢复也只需要修改这两位为偶数即可。
解压软件如何判断是否加密
经过实测,7-Zip检测record区的frFlags
位,其他解压软件,例如BandZip和WinRAR检测dirEntry区的deFlags
位,这三种软件都只检测一位,并不会检测另一个位置,同时也不会进行报错。
解压工具 | 检测位置 |
---|---|
BandZip | deFlags |
WinRAR | deFlags |
7-Zip | frFlags |
**注意:**据群友所述,2345好压是一个很神奇的软件,它会默认将加密的Zip先按照无加密尝试一次,如果成功解压则直接解压,如果解压失败再输入密码,所以似乎天生对伪加密有抗性?真正的一把梭工具,但是真实性自行验证,我不太想让我的电脑沾上好压。
一把梭工具如何判断是否加密
随波逐流
经测试高版本随波逐流(指支持解伪加密的版本)默认检测的是record区的deFlags
位。
PuzzleSolver Pro
待测试…
评论
评论插件加载失败
正在加载评论插件