CRC32爆破原理介绍:
CRC(循环冗余校验)是一种用于检测数据传输错误的技术。
CRC算法生成一个校验值(校验和),这个值可以附加到数据后面,在数据接收方重新计算校验值并与附加的校验值进行比较,以此来确定数据是否在传输过程中发生了错误
CRC32是一种常用的CRC算法,它的校验值长度固定为32位,具体来说:
- 位数:CRC32产生的校验值是一个32位(4字节)的无符号整数
- 范围:32位无符号整数的范围是从
0x00000000
到0xFFFFFFFF
,即从0到4294967295
爆破CRC32值获取压缩包文件内容的原理就是:
每个文件都有唯一的CRC32值,虽然不知道压缩包的解压密码,但是如果知道压缩包中文件的大小和CRC32值
那么通过不断穷举数据,直到穷举的字符串内容的crc32值与压缩包中文件的crc32的值相同时就匹配成功,即找到了文件的内容,这样就可以达到暴力破解的目的,而不需要获取压缩包解压密码
但是crc32爆破的适用条件也很明显,方法的关键是暴力枚举,所以只适用于文件大小较小的文件,一般是低于5字节(byte) 超出这个大小就很难利用这种方法得到结果
既然需要暴力枚举,那么用脚本来进行操作是不可或缺的,结合下面的ctf例题 题解中会给出脚本,是4字节文件的crc32爆破脚本,并且详细解释代码的思路和用到的函数和类的作用
[MoeCTF 2022]cccrrc
题目给出的压缩包文件中有四个文件,需要密码才能解压缩
对于加密的压缩包进行解压缩时,如果题目给出的文件没有发现与密码有关的提示,无从下手,可以考虑几个解题思路:
伪加密 暴力破解密码 文件分离 明文攻击 crc32爆破 等
因为这里讲的是crc32爆破,所以其他思路经过尝试当然是不可行的
推荐用winRAR 打开压缩包,可以看到文件大小信息和crc32值,比较方便,虽然有广告但是瑕不掩瑜
看到压缩包中的四个文件大小都是4字节,所以很符合crc32爆破的条件,下面就是利用脚本爆破
脚本中的关键代码给出了注释,便于理解
脚本:
import string
import binascii
import zipfile
#四字节文件内容crc爆破
def CrackCrc(crc):
for i in dic:
for j in dic:
for p in dic:
for q in dic:
s = i + j + p + q #枚举4个字节的字符串
s = s.encode() #encode()方法用于将字符串转换成字节串(bytes),用于处理二进制数据
if crc == (binascii.crc32(s) & 0xffffffff):
#binascii.crc32()接受一个字节串 (bytes) 作为参数,并返回一个整数,表示计算得到的 CRC32 校验和,& 0xffffffff 用于确保结果是一个32位(4字节)无符号整数
return s
def CrackZip(txt):
f = zipfile.ZipFile('F:\\CTF\\NSSCTF_杂项\\cccrrc\\cccccrc.zip', 'r') #读取zip压缩包文件
GetCrc = f.getinfo(txt) #使用 getinfo 方法获取ZIP压缩包中指定文件的信息并赋值给GetCrc,GetCrc被赋值为一个ZipInfo 对象,它包含了文件的各种信息,包括CRC值
crc = GetCrc.CRC #自动获取文件的crc32值,获取的是crc32值的十进制格式
#print(crc)
s1=CrackCrc(crc)
return s1
dic = string.printable #包含所有可打印的ASCII字符
#打印压缩包中的所有文件名,不是必要的步骤,只是顺手获取信息
with zipfile.ZipFile('F:\\CTF\\NSSCTF_杂项\\cccrrc\\cccccrc.zip', 'r') as zip_file:
# 使用namelist()方法获取文件列表
file_list = zip_file.namelist()
print(file_list)
flag=b"" #b表示字节串
for i in file_list:
flag+=CrackZip(i)
print(flag)
标签:文件,字节,题解,校验,CRC32,crc32,cccrrc,MoeCTF,压缩包 From: https://blog.csdn.net/weixin_73904941/article/details/143169378