CRC32爆破小结

前言

最近在bugku遇到了一道隐写题,binwalk之后发现里面有很多个压缩包。。。。。。然后就无从下手,于是查看别人大佬的wp才发现是CRC32爆破,由于本人第一次遇到这种题目,就记录一下吧。。

正文

CRC想必大家都知道,它的全称是循环冗余校验(Cyclic Redundancy Check, CRC),用来校验文件是否出错但并不能用于自动纠错。。emmmm,计组上课好像讲过,老师让我们回去自己学,记得当时只是初略了解了一下,就是在后面加上一小段冗余位去检测,详细规则谷歌一下吧。。。。

这里写图片描述

这里我以破解四位CRC的压缩包为例。。。。写一个理解之后的脚本

#coding:utf-8

import binascii
import string 

dic=string.printable     #各种打印字符

crc = '''你的输入 '''     # 记得要以0x开头
def CrackCrc(crc):
    for i in dic :
        for j in dic:
            for p in dic:
                for q in dic:
                    s=i+j+p+q
                    if crc == (binascii.crc32(s) & 0xffffffff):
                        print s

特别注意

if (binascii.crc32(str(i)) & 0xffffffff) == crc:

在 Python 2.x 的版本中,binascii.crc32 所计算出來的 CRC 值域为[-2^31, 2^31-1] 之间的有符号整数,为了要与一般CRC 结果作比对,需要将其转为无符号整数,所以加上& 0xffffffff来进行转换。如果是 Python 3.x 的版本,其计算结果为 [0, 2^32-1] 间的无符号整数,因此不需额外加上& 0xffffffff 。

下面就bugku那道多个压缩包为例,上脚本

#coding:utf-8

import binascii
import string 
import zipfile
# def tansnum(s):
#     return int(s, 16)  转十六进制


dic=string.printable

def CrackCrc(crc):
    for i in dic :
        for j in dic:
            for p in dic:
                for q in dic:
                    s=i+j+p+q
                    if crc == (binascii.crc32(s) & 0xffffffff):
                        print s
                        #return 


def getcrc32():
    l=[]
    for b in range(68):
        file = 'out' + str(b) + '.zip'
        f = zipfile.ZipFile(file,'r')
        GetCrc = f.getinfo('data.txt')
        crc = GetCrc.CRC
        l.append(hex(crc))
    return l



if __name__  == "__main__":
    #c = open('out.txt', 'w')
    l = getcrc32()
    for i in l:
       CrackCrc(i)
    #c.close()

如果上面的python操作zip文件还不太懂的话看看这个:https://www.cnblogs.com/sun-haiyu/p/7082063.html,简单的来说就是用ZipFile读取文件,用getinfo函数获取信息。。。
特别注意,上面的脚本跑这一题十分慢,我跑了差不多40分钟都没跑完。。。效率极低,所以啊有空我还是学习一下多线程该怎么跑。。。

另外还有一款很好用的6位的CRC32爆破

附上神器:https://github.com/theonlypwner/crc32
具体使用方法:

python crc32.py reverse 你的crc32密文

这里的密文记得加上0x变成16进制。。。即可非常迅速的爆破出对应的数据,举个例子

CRC32爆破小结_第1张图片
这里就有点哈西冲突的体现了^_^

这个CRC32爆破一旦超过六位,我觉得毫无疑义,毕竟密码超过7位你爆破需要花很长的时间,对于这个也一样。。。。
这就从另外一个角度诠释了什么叫无法破解的密码(#^.^#),虽然这一个东西也会出现类似哈希冲突的现象。。。。。。

参考文章
http://www.360zhijia.com/360anquanke/217342.html

你可能感兴趣的:(CTF,Misc)