刚学ctf遇到crc32碰撞的题。
直接上代码。
import string
import threading
import binascii
import sys
def crc(_crc):
l = 1
dic = string.printable
_input = _crc
_input = "0X" + _input
for i in dic:
for n in dic:
for h in dic:
for m in dic:
s = i + n + h + m
s = s.encode()
# print(str(binascii.crc32(s)), _input)
if hex(binascii.crc32(s)).upper() == _input.upper():
print(_crc, ':', s.decode())
print(l)
sys.exit() #直接退出,不进行接下来的碰撞了,一般在做题的时候,碰撞不会重复
l = l + 1
def crc32():
print("四字节碰撞!!!")
num = int(input("你可能需要多个线程同时进行碰撞,请输入线程数:"))
_thread = []
_args = []
print("输入参数")
for i in range(num):
print(i+1, end=':')
_args.append(input())
# print(_args)
for i in range(num):
t = threading.Thread(target=crc, args=(_args[i],))
_thread.append(t) #如果在这里开始线程会出一点小bug,虽然不要紧,但是不好看,不信的话你们自己试试
# print(_thread)
for i in range(num):
_thread[i].start()
for i in range(num):
_thread[i].join()
input()
if __name__ == '__main__':
crc32()
我看了其他人写的代码,他们都没有加多线程,python的多线程虽然不是正儿八经的多线程,但是这么写以后用起来比较方便(一次性输入所有的crc32校验码,然后一次性算出来)
注意
一般情况,碰撞的字节数不会超过5(通常是3或者4字节),否则要碰撞很久,碰撞时间太久的话这个题就没什么意思了。一般看见压缩包里有很多文件,每个文件大小都小于5字节,才会用crc32碰撞。