unctf2022 md5-1 (python实现MD5碰撞)
首先下载并解压文件
这是txt文件内容
用pycharm 打开.py文件
这里是py文件源码
from hashlib import md5
flag='UNCTF{%s}'%md5('x'.encode()).hexdigest()
# x不是一个字符是n个字符
for i in flag:
with open('out.txt','a')as file:
file.write(md5(i.encode()).hexdigest()+'\n')
其中的flag就是是我们要的东西。但是看最后三行,flag中的每一个字母都被MD5加密让后写入了文件中。所以直接对文件中的md5进行解密就可以得到flag。
注意: 源码中的的文件写入采用的是追加的方式,如果不小心运行或者单击的.py文件都会吧文件弄乱,(即把x字母的MD5密码的每一个字符再MD5加密加到文件后面)
由于密码太多,一条条解密太麻烦,于是我写了个程序
from hashlib import md5
file=open("out.txt",'r') #out.txt是MD5密码放的位置
#列出flag中可能会出现的字符
list=['1','2','3','4','5','6','7','8','9','0','q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m','Q','W','E','R','T','Y','U','I','O','P','A','S','D','F','G','H','J','K','L','Z','X','C','V','B','N','M','{','}','_']
while True:
line=file.readline()
passw=line.strip()
for ans in list:
if md5(ans.encode('utf-8')).hexdigest()==passw:
print(ans,end='')
break
if not line:
break
优化建议
判断是否碰撞成功,如果失败输出”失败“进行提示
此程序采用MD5碰撞的方式进行爆破,运行后就可以得到flag