很久之前就遇到了,感觉有点繁琐和难就跳过去了,一直拖不是办法。
下载附件得到:
67个加密的压缩包:
这里总结介绍一下对于加密的压缩包的常见处理方法,伪加密这里未涉及就不说了(就是修改了标识位,用修复脚本跑就行)。对于加密的压缩包,我们通常有会对其进行检查,有无提示信息,对于没有提示信息类的就只能采取暴力破解,暴力破解无非是使用可能的密码尝试进行解压操作,可行的方法有两种:
1. 通过密码字典收集的常用密码进行破解
2. 通过穷举可能的密码进行破解
第一种就不多说了,这里用到和涉及到的是第二种, 有种基于CRC32来还原压缩包内容的方法。
CRC:全称是循环冗余校验(Cyclic Redundancy Check,CRC),用来检验文件是否出错。
CRC32表示会产生一个32bit(8位十六进制数)的校验值。
计算CRC32的值,这里介绍一下Python提供的库函数来计算,Python的binascii模块。
因为计算出来的结果是一个有符号数,所以可能会看到结果为负数,因此需要将结果和0xFFFFFFFF进行一个位运算与操作
import binascii
def calcCRC32(s):
crc = binascii.crc32(s)
return crc & 0xFFFFFFFF
对于本题中给出的加密的压缩包,里面的txt原始的大小只有4个字节,我们可以尝试枚举可能的4字节内容,然后计算CRC32值来进行校验。
有了上面的介绍,脚本就好理解了。
import zipfile
import string
import binascii
def CrackCrc(crc):
for a in dic:
for b in dic:
for c in dic:
for d in dic:
e = a + b + c + d
if crc == (binascii.crc32(e.encode())):
f.write(e)
return #对比枚举的Crc是否正确
dic = string.ascii_letters + string.digits + '+/=' #确定枚举字典的范围,调用的string库
def CrackZip():
for i in range(68):
file = 'out' + str(i) + '.zip'
f = zipfile.ZipFile(file, 'r')
GetCrc = f.getinfo('data.txt')
crc = GetCrc.CRC #获取数据
# print(hex(crc))
CrackCrc(crc)
f = open('out.txt', 'w')
CrackZip()
f.close()
string库函数的简介:
ascii_letters 大小写字母常数
print(string.ascii_letters)
#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
ascii_lowercase 小写字母常数
print(string.ascii_lowercase)
# abcdefghijklmnopqrstuvwxyz
digits 十进制数字常数
print(string.digits)
# 0123456789
看样子要修复压缩包
应该是这个数据
对比正确的rar,这个应该是缺头少尾。
RAR16进制文件头:52 61 72 21 1A 07 00
RAR16进制文件尾:C4 3D 7B 00 40 07 00
这里就没再放010Editor里面弄,直接Cyberchef里面加上的。
然后保存,在压缩包的注释里得到flag,解完压得到的flag.txt是提示:
其余的CRC爆破的还没怎么遇到,这里就不先总结了。