zip 伪加密学习,压缩包十六进制数据含义分析
——
一个zip文件由三部分组成:
- 压缩源文件数据区
- 压缩源文件目录区
- 压缩源文件目录结束标志。
先拿一个正常的压缩包为例,用 010 editor 打开。
在 010 editor 里可以比较好得区分 zip 文件的三部分。如下图中,
前面的灰色背景的十六进制数字为压缩源文件数据区,
中间紫色背景的十六进制数字为压缩源文件目录区,
后面黄色背景的十六进制数字为压缩源文件目录结束标志。
不同文件中每个部分的十六进制数据可能会有不同,但是根据每个部分的开头位置开始找,对应相同含义的数据会在相同的位置。
压缩源文件数据区
50 4B 03 04:头文件标记
0A 00:解压文件所需 pkware 版本
00 00:全局方式位标记(通过此处判断有无加密),文件头标记后 2bites 。
08 00:压缩方式
72 98:最后修改文件时间
c3 52:最后修改文件日期
A7 DE 6A 5F:CRC-32校验(1480B516)
07 00 00 00:压缩后尺寸(25)
07 00 00 00:未压缩尺寸(23)
08 00:文件名长度
00 00:扩展记录长度
——
——
压缩源文件目录区
50 4B 01 02:目录中文件文件头标记
3F 00:压缩使用的 pkware 版本
0A 00:解压文件所需 pkware 版本
00 00:全局方式位标记(有无加密,伪加密的关键) 目录文件文件头标记后 4bytes 。
08 00:压缩方式
72 98:最后修改文件时间
c3 52:最后修改文件日期
A7 DE 6A 5F:CRC-32校验
07 00 00 00:压缩后尺寸(25)
07 00 00 00:未压缩尺寸(23)
08 00:文件名长度
24 00:扩展字段长度
00 00:文件注释长度
00 00:磁盘开始号
00 00:内部文件属性
20 00 00 00:外部文件属性
00 00 00 00:局部头部偏移量
——
——
压缩源文件目录结束标志:
50 4B 05 06:目录结束标记
00 00:当前磁盘编号
00 00:目录区开始磁盘编号
01 00:本磁盘上纪录总数
01 00:目录区中纪录总数
5A 00 00 00:目录区尺寸大小
2D 00 00 00:目录区对第一张磁盘的偏移量
00 00:ZIP 文件注释长度
——
——
未加密
像上面这个文件,
压缩源文件数据区的全局方式位标记为 00 00 (50 4B 03 04 后两个 bytes );
且压缩源文件目录区的全局方式位标记为 00 00 (50 4B 01 02 后四个 bytes )。
所以这是一个普通的压缩文件,没有加密或伪加密。
——
——
伪加密
用一个 ctf 中 misc 方向的伪加密的文件举例。
打开压缩包里面还有一个文件夹。
进入文件夹里面有一个 flag.txt 文件,但是无法打开。
用 010 editor 打开压缩包,搜索关键字,可以看到压缩源文件数据区和压缩源文件目录区都有两个可供我们确定位置的文件头标记。这是一位压缩包中有 2 级目录,即前面说的打开压缩包里面还有一个文件夹。
依此类推,如果压缩包内存在多级目录,那查看压缩包十六进制数据就会有多个文件头标记。
然后可以看到,这里
压缩源文件数据区的全局方式位标记为 00 00 ;
且压缩源文件目录区的全局方式位标记为 09 00
所以这是伪加密,导致前面文件无法打开。
——
——
真加密
再看一个经过真正加密的压缩包。
用 010 editor 打开,看到这里
压缩源文件数据区的全局方式位标记为 01 00
且压缩源文件目录区的全局方式位标记为 01 00
总结,
压缩包看是否加密或伪加密,就看压缩源文件数据区的全局方式位和压缩源文件目录区的全局方式位标记两个位置。
这两个位置都是 00 00 四个数字,看前两个 0x ,如果 x 为偶数,则为未加密,x 为奇数,则为加密。