首页 > 其他分享 >CRC32爆破脚本 + [MoeCTF 2022]cccrrc 题解

CRC32爆破脚本 + [MoeCTF 2022]cccrrc 题解

时间:2024-10-23 12:48:55浏览次数:10  
标签:文件 字节 题解 校验 CRC32 crc32 cccrrc MoeCTF 压缩包

CRC32爆破原理介绍:

CRC(循环冗余校验)是一种用于检测数据传输错误的技术。

CRC算法生成一个校验值(校验和),这个值可以附加到数据后面,在数据接收方重新计算校验值并与附加的校验值进行比较,以此来确定数据是否在传输过程中发生了错误

CRC32是一种常用的CRC算法,它的校验值长度固定为32位,具体来说:

  • 位数:CRC32产生的校验值是一个32位(4字节)的无符号整数
  • 范围:32位无符号整数的范围是从 0x000000000xFFFFFFFF,即从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

相关文章

  • P7910 [CSP-J 2021] 插入排序 题解
    正解首先要注意$2$点:修改数组元素的值会影响接下来的操作.对数组进行排序不会影响接下来的操作.思路直接扫一遍数组.假设排序后$a_x$会在第$p$位上.将$p$初始化为$n$.然后就开始找$x$前后有多少个小于$a_x$的值就行了.时间复杂度:$\Theta(nq)$.注意......
  • P7911 [CSP-J 2021] 网络连接 题解
    模拟代码#include<iostream>#include<cstdio>#include<cstring>usingnamespacestd;intn,p=1,ans[1003];//没事干的ans数组structnode{ stringop,ad;}a[1003];intws(intn){//位数 intsum=0; if(n==0)return1; while(n){ n......
  • P8816 [CSP-J 2022] 上升点列 题解
    最长上升子序列根据题目中,每个坐标的横纵坐标均单调递增,所以明显可以使用最长上升子序列.定义状态$f_{i,p}$,表示正在节点$i$时,还剩下$p$次插入机会,所能达到的最大长度.定义变量$dis=|x_i-x_j|+|y_i-y_j|-1.$,表示$i$到$j$节点至少要插$dis$个节点.为什么要$-1$......
  • ARC165F题解
    前言\(2024.10.19\)日校测\(T4\),思维太庙,被薄纱了,遂哭弱,写题解以记之。简要题意给你一个长度为\(2n\)的序列\(A,\foralla_i\in[1,n]\),其中\(1\)到\(n\)每个数都出现了两次,现在需要把相同的两个数排到一起,每次操作只能交换相邻两个数,在保证操作次数最小的情况下求出现......
  • P8814 [CSP-J 2022] 解密 题解
    解方程$题目中说,n=pq,ed=(p-1)(q-1)+1,m=n-ed+2.$$把ed的式子展开,得到:$$ed=p(q-1)-(q-1)+1$$ed=pq-p-q+2$$再把展开后的式子带入m中,得:$$m=n-(pq-p-q+2)+2.$$m=n-pq+p+q-2+2$$\becausen=pq$$\thereforem=pq-pq+p+q-2+2$$m=p+q.$$如果想要求出p和q的值,那么可以再......
  • P8815 [CSP-J 2022] 逻辑表达式 题解
    短路我们可以使用一个变量来记录当前有没有短路.设变量短路为$dl$.当$dl$为$0$时,说明当前值为$0$,且运算符为&.当$dl$为$1$时,说明当前值为$1$,且运算符为|.代码重点讲完了,细节可以看代码以及注释.#include<iostream>#include<cstdio>#include<cstring>using......
  • 最佳序列 题解
    最佳序列题解题目描述你得到了一个\(N\)个非负整数组成的序列\(A\)。我们称由序列\(A\)的连续若干项组成的新序列为\(A\)的一个连续子序列。给出两个正整数\(L,R(L\leR)\)。称\(A\)的每一个长度不小于\(L\)且不大于\(R\)的连续子序列为一个纯洁序列,定义纯洁度......
  • 题解 [NOIP2022] 建造军营
    树形\(dp\)好题。观察题目发现,如果B国袭击后,导致A国两个军营不联通,那么B国袭击的一定是一条割边,反之,如果袭击的不是割边,那么不会导致任何影响。所以先进行边双缩点,变成一棵树,记每个联通块(缩完后)内的点数为\(wa\),边数为\(wb\),不妨先考虑对于树的情况如何处理。将问题进行转......
  • 20241022 校测T1 链链链(chain)题解
    Problem链链链chain你有一个长度为\(n\)的链,编号为\(i(1≤i<n)\)的边连接着结点\(i\)与\(i+1\)。每个结点\(i\)上有一个整数\(a_i\)。你需要做以下操作\(n−1\)次:•选择一条还未被断开的边,设其连接了点\(i\)与\(i+1\),将其断开。•断边后,对于所......
  • P9751 [CSP-J 2023] 旅游巴士 题解
    思路首先,举一个例子,假如说小Z到了入口,但是没到时间,所以没法进去,该怎么办?当然是等$k$个时间单位呀.除此之外,像到了其他景区,但是还没开门怎么办?继续等$k$的非负整数倍时间呀.知道这个后,我们先定义状态$f_{i,j}$,表示到达点$i$时,路径长度(即时间)$mod$$k$的最早时......