压缩包出题点
1. 伪加密
对本没有加密的文件通过修改加密位(zip里是deFlag或frFlags,rar里是HEAD_FLAGS的PASSWORD_ENCRYPTED),实现伪加密。
- 仅限zip#winrar 工具-修复压缩文件(快捷键 alt+r),或7zip打开
- 010手动修复 #知识点1 #知识点4
- 仅限zip#使用工具批量自动解:ZipCenOp.jar r zip文件
2. CRC32泄露
在小范围内,每个文件都有唯一的crc32值。通过crc32字典来比对密文内容。
- 对于1-6字节的已知crc32,使用my_crc32.py(kali里已经拷贝过去了)
from my_crc32 import *
crc32_reverse(0x76D32BE0,N) #N为字节数
3. zip明文攻击
因为ZIP压缩包里的所有文件都是使用同一个加密密钥来加密,明文攻击就是利用已知文件找加密密钥。发起攻击需要至少12字节的连续明文。明文越大, 完成攻击越快。
- Advanced Archive Password Recovery。使用winrar\7zip分别将已知文件加密,选择明文攻击进行破解。
- Passware,选择zip plaintext attack
4. 暴力破解
一般来说会给密码提示,如果没有,就默认4-6位字母+数字的密码试试。
ziperello和passware,支持掩码破解
AAPR,可以使用字典,但是无法自定义charsets
fcrackzip,kali 自带,备用以防没有
# 数字 小写字母 特殊字符,1-5位
fcrackzip -b -c '1a!' -l 1-5 -u test.zip -v
# 全数字密码 9位 从244999998
fcrackzip -v -b -c '1' -l 9 -p 244999998 -u rebuilt.2.zip
压缩包配套习题
题目1:zip大礼包
- 打开看见信息里有密码提示,注释: 密码为4位小写字母3位数字,用passware解join attack出来是ydyd233
- 打开发现里面是一个长的txt和level2压缩包,提示明文攻击,记得用passware接plaintext attack解出来得到0F12FB319690345764D57538
- 然后level1的几个小txt里藏压缩包密码,很明显是crc32了
>>> from my_crc32 import * >>> crc32_reverse(0xDD0216B9,1) [find]: I ~~~~(OK) >>> crc32_reverse(0xA0D65196,2) [find]: AM (OK) >>> crc32_reverse(0x8E9089A5,3) [find]: XYH (OK) >>> crc32_reverse(0xf8e53990,4) verification checksum: 0xf8e53990 (OK) [find]: PASS (OK) >>> crc32_reverse(0x8629dc3c,5) verification checksum: 0x8629dc3c (OK) [find]: WORDS (OK)
- 最后一关提示要密码,伪加密修复标志位,解压缩,png图片修复高度得到:flag{a8d93d2f2a15fc3f531474b5f13508207cdfc924}
题目2:RAR大礼包
- 打开提示有密码,密码提示为2个大写2个小写,passware跑出来得到DAka。
- 这次是真的没有提示了,猜测为伪加密,010手动修改。archeader里正常,block[0]里PASSWORD_ENCRYPTED被置为1,改成0后用winrar打开得到:flag{64b5ca5f886aed350dfe6d3d590728eed2f188af}
- 但追求完dan美teng的做法是改好crc32然后7zip打开:
压缩包知识点
知识点1:zip加密标志位
- 单独文件的加密标志位叫做 deFlags,在dirEntry中,修复为0000
- zip文件整体加密标志位叫frFlags 在最开头那里
知识点2:zip文件格式
一个 ZIP 文件由三个部分组成:压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志。相关头部数据为大端存储
Overall .ZIP file format:
[Local file header + Compressed data [+ Extended local header]?]*
[Central directory]*
[End of central directory record]
Overall .ZIP file format:
[local file header 1]
[file data 1]
[data descriptor 1]
.
.
.
[local file header n]
[file data n]
[data descriptor n]
[archive decryption header] (EFS)
[archive extra data record] (EFS)
[central directory]
[zip64 end of central directory record]
[zip64 end of central directory locator]
[end of central directory record]
1. 文件数据区
- Local file header
Offset Length Contents
0 4 bytes Local file header signature (0x04034b50)
4 2 bytes Version needed to extract //解压缩时的最低版本
6 2 bytes General purpose bit flag //全局加密标志区 (有无加密,这个更改这里进行伪加密,改为09 00/01 08 或者01 00 打开就会提示有密码了。修改为00 00 取消伪加密)
8 2 bytes Compression method //压缩方法标记
10 2 bytes Last mod file time
12 2 bytes Last mod file date
14 4 bytes CRC-32
18 4 bytes Compressed size (n)
22 4 bytes Uncompressed size
26 2 bytes Filename length (f)
28 2 bytes Extra field length (e)
(f)bytes Filename
(e)bytes Extra field
(n)bytes Compressed data
- Extended local header
Offset Length Contents
0 4 bytes Extended Local file header signature (0x08074b50)
4 4 bytes CRC-32
8 4 bytes Compressed size
12 4 bytes Uncompressed size
2. 主目录区
其实就是文件标识区,Central directory
Offset Length Contents
0 4 bytes Central file header signature (0x02014b50)
4 2 bytes Version made by //压缩时的版本
6 2 bytes Version needed to extract //解压缩需要的最低版本
8 2 bytes General purpose bit flag //通用位标记 (有无加密,这个更改这里进行伪加密,改为09 00/01 08 或者01 00 打开就会提示有密码了。修改为00 00 取消伪加密)
10 2 bytes Compression method //压缩方法标记 见下方详解
12 2 bytes Last mod file time //文件修改时间
14 2 bytes Last mod file date //文件修改日期
16 4 bytes CRC-32
20 4 bytes Compressed size //压缩后大小
24 4 bytes Uncompressed size //未压缩大小
28 2 bytes Filename length (f) //文件名长度
30 2 bytes Extra field length (e) //扩展域长度
32 2 bytes File comment length (c) //文件注释长度
34 2 bytes Disk number start
36 2 bytes Internal file attributes
38 4 bytes External file attributes
42 4 bytes Relative offset of local header
46 (f)bytes Filename
(e)bytes Extra field
(c)bytes File comment
其中,compression method: (2 bytes)
0 - The file is stored (no compression)
1 - The file is Shrunk
2 - The file is Reduced with compression factor 1
3 - The file is Reduced with compression factor 2
4 - The file is Reduced with compression factor 3
5 - The file is Reduced with compression factor 4
6 - The file is Imploded
7 - Reserved for Tokenizing compression algorithm
8 - The file is Deflated
3. 目录结束标识
End of central directory record
Offset Length Contents
0 4 bytes End of central dir signature (0x06054b50)
4 2 bytes Number of this disk
6 2 bytes Number of the disk with the start of the central directory
8 2 bytes Total number of entries in the central dir on this disk
10 2 bytes Total number of entries in the central dir
12 4 bytes Size of the central directory
16 4 bytes Offset of start of central directory with respect to the starting disk number
20 2 bytes zipfile comment length (c)
22 (c)bytes zipfile comment
知识点3:rar文件格式
RAR 文件主要由标记块,压缩头块,文件头块,结尾块组成。 相关头部数据为小端存储
文件中每个数据块都有一个7字节标准的块头。
注1:CRC为CRC32的低2个字节(MARK_HEAD的CRC 为固定的0x5261,非计算出来的值)
注2:
HEAD_TYPE=0x72 标记块
HEAD_TYPE=0x73 压缩文件头
HEAD_TYPE=0x74 文件头
HEAD_TYPE=0x75 注释头
HEAD_TYPE=0x76 旧风格的用户身份信息
HEAD_TYPE=0x77 子块
HEAD_TYPE=0x78 恢复纪录
HEAD_TYPE=0x79 用户身份信息
HEAD_TYPE=0x7a subblock
1. Marker block ( MARK_HEAD)标志块
7字节,固定为0x526172211a0700
HEAD_CRC 2 bytes Always 0x6152
HEAD_TYPE 1 byte Header type: 0x72
HEAD_FLAGS 2 bytes Always 0x1a21
HEAD_SIZE 2 bytes Block size = 0x0007
ADD_SIZE 4bytes 可选字段 - 添加块大小
2. Archive header ( MAIN_HEAD)归档头部块
HEAD_CRC 2 bytes 从头域HEAD_TYPE到头域RESERVED2的CRC
HEAD_TYPE 1 byte Header type: 0x73
HEAD_FLAGS 2 bytes Bit flags:
0x0001 - Volume attribute (archive volume)//卷属性标志(归档文件卷)
0x0002 - Archive comment present//此位若被置1,注释存在
0x0004 - Archive lock attribute//归档锁属性标志
0x0008 - Solid attribute (solid archive)//此位若被置1,则使用了固实模式压缩
0x0010 - New volume naming scheme ('volname.partN.rar')//新卷命名方案存在标志(set only by RAR 3.0 and later)
0x0020 - Authenticity information present//此位若被置1,授权信息存在
0x0040 - Recovery record present//此位若被置1,则恢复记录存在
#加密标志位
0x0080 - Block headers are encrypted//此位若被置1,则块头是被加密的
0x0100 - First volume (set only by RAR 3.0 and later)//此位若被置1,则此卷为首卷
其他的位为内部使用保留
HEAD_SIZE 2 bytes //归档头部块大小,包括归档文件注释。
RESERVED1 2 bytes //Reserved
RESERVED2 4 bytes //保留域
3. File header (File in archive)文件块(被归档的文件)
HEAD_CRC 2 bytes //从头域HEAD_TYPE到头域FILEATTR的CRC
HEAD_TYPE 1 byte
Header type: 0x74
HEAD_FLAGS 2 bytes Bit flags:
0x01 - file continued from previous volume//此位若被置1,则文件从前一个卷继续
0x02 - file continued in next volume//此位若被置1,则文件在后一个卷继续
#加密标志位
0x04 - file encrypted with password//此位若被置1,则文件使用了基于密钥的加密
0x08 - file comment present//此位若被置1,则文件注释存在。RAR 3系列的版本使用独立的注释块。
0x10 - information from previous files is used (solid flag)//此位若被置1,则之前的文件信息被使用(for RAR 2.0 and later)
bits 7 6 5 (for RAR 2.0 and later)
0 0 0 - dictionary size 64 KB
0 0 1 - dictionary size 128 KB
0 1 0 - dictionary size 256 KB
0 1 1 - dictionary size 512 KB
1 0 0 - dictionary size 1024 KB
1 0 1 - dictionary size 2048 KB
1 1 0 - dictionary size 4096 KB
1 1 1 - file is directory 以整个文件作为字典
0x100 - HIGH_PACK_SIZE and HIGH_UNP_SIZE fields are present.//此位若被置1,则头域HIGH_PACK_SIZE 和HIGH_UNP_SIZE存在。这些头域仅用于归档很大(大于2GB)文件的时候,对于不足2GB的小文件,这些头域是不存在的。
0x200 - FILE_NAME contains both usual and encoded Unicode name separated by zero. //此位若被置1,则FILE_NAME同时包括了通常的文件名和用0隔开的以Unicode编码的文件名.在这种情况下,NAME_SIZE 头域的值就该等于:通常的文件名长度+以Unicode编码的文件名长度+1.
0x400 - salt //强安全性标志。此位若被置1,则头部在文件名之后还会再附加8个字节用来增强加密强度.
0x800 - Version flag。//此位若被置1,则这是一个老版本的文件,版本号以”;n”的形式被附加到文件名后。
0x1000 - Extended time field present.//此位若被置1,则存在扩展的时间头域
0x8000 - //数据长度头域存在标志。此位若被置1,则头域PACK_SIZE存在。此位通常都会被置为1,因此完整的块大小是HEAD_SIZE + PACK_SIZE(如果位0x100被设定的话,那么还要加上HIGH_PACK_SIZE)
HEAD_SIZE 2 bytes //文件块大小,包括文件名和内容
PACK_SIZE 4 bytes //压缩后的文件大小
UNP_SIZE 4 bytes //没有压缩之前的文件大小
HOST_OS 1 byte //归档(压缩)操作时所在的操作系统
0 - MS DOS
1 - OS/2
2 - Win32
3 - Unix
4 - Mac OS
5 - BeOS
FILE_CRC 4 bytes //被归档文件的CRC
FTIME 4 bytes //标准MS DOS格式的时间和日期
UNP_VER 1 byte //释放(即解压)文件所需要的RAR(最低)版本,版本号的是编码方式是:10*主版本号+小版本号
METHOD 1 byte //压缩模式
0x30 - storing 存储
0x31 - fastest compression 最快压缩
0x32 - fast compression 快压缩
0x33 - normal compression 普通压缩
0x34 - good compression 好压缩
0x35 - best compression 最好压缩
NAME_SIZE 2 bytes 文件名长度
ATTR 4 bytes //文件属性
HIGH_PACK_SIZE 4 bytes //已压缩文件大小的64位值的高位四字节。可选的头域,仅当块标志的0x100位被置为1时才存在。
HIGH_UNP_SIZE 4 bytes //未压缩文件大小的64位值的高位四字。可选的头域,仅当块标志的0x100位被置为1时才存在。
File name - string of NAME_SIZE bytes size//文件名(所占字节数由头域NAME_SIZE指定)
SALT 8 bytes //盐.仅当块标志的0x100位被置为1时才存在
EXT_TIME //大小可变 扩展的时间头域。仅当块标志的0x1000位被置为1时才存在。 其他新加的头域可能在这里出现
4. 尾头(Terminator)
There is often a terminating block present.固定为0xC43D7B00400700
Field Name | Size (bytes) | Possibilities |
---|---|---|
HEAD_CRC | 2 | Always 0x3DC4 |
HEAD_TYPE | 1 | Header type: 0x7b |
HEAD_FLAGS | 2 | Always 0x4000 |
HEAD_SIZE | 2 | Block size = 0x0007 |
转载地址:
- https://download.csdn.net/download/ping_fani07/5353575
- https://www.rarlab.com/technote.htm
- http://rescene.wikidot.com/rar-420-technote
知识点4:RAR伪加密
RAR伪加密时需要同时修改加密位 和 crc值。(其实不改crc也没事,用winrar打开就行了,但会报个错)
加密位:
- Archive header ( MAIN_HEAD )�的HEAD_FLAGS,0x0080 此位若被置1,则块头是被加密的
File header (File in archive)� 的HEAD_FLAGS,PASSWORD_ENCRYPTED(0x04)此位若被置1,则文件使用了基于密钥的加密
CRC计算`
File header (File in archive)� 的CRC32:从头域HEAD_TYPE到头域FILEATTR的CRC 。CRC值为需要同时计算红框内/选中的部分CRC32 的低2字节(复制为16进制,大厨from hex后 计算crc32,取最后两个字节,直接在value那边改)
written by watanuki