CTF-CRC32碰撞

题目链接:

链接:https://pan.baidu.com/s/1ecQH2MfWSraSKbnfalhr5Q 
提取码:1qgi 

总共36个压缩包,每个压缩包里有一个“flag.txt"的3字节大小文件

使用crc32碰撞来完成

python脚本代码(python2.7。借鉴某个大神的):

#coding:utf-8
import zipfile
import string
import binascii

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

def CrackZip():
    for I in range(36):
        file = 'flag' + str(I) + '.zip'
        f = zipfile.ZipFile(file, 'r')
        GetCrc = f.getinfo('flag.txt')
        crc = GetCrc.CRC
        #以上3行为获取压缩包CRC32值的步骤
        #print hex(crc)
        CrackCrc(crc)

dic = string.ascii_letters + string.digits + '+/='

f = open('out.txt', 'w')
CrackZip()
f.close()

得到一个dout.txt的文件,截图部分

经过尝试发现这是ASCII码的十进制数字,对应的字符串应该是base64加密的,使用脚本将其还原

还原代码(python3.7):

import base64
list=[]
#逐行读取
for line in open("out.txt","r"):
    a=int(line)
    #将十进制ASCII码转换成字符串,并添加到列表
    list.append(chr(a))
    #打印输出经过base64转换的列表
print(base64.b64decode("".join(list)))

得到flag

flag{2iP_Crc_i5_v3Ry_fUn}