53.实验吧——try them all
2018-09-12 本文已影响0人
扶桑啊啊
题目:http://www.shiyanbar.com/ctf/1981
image.png看题干的意思是密码是经过加盐后,用md5加密的,首先还原加密过程
from hashlib import md5
def salted_password(pwd):
plaintext = "%s%s" % (pwd, '5948')
md5_obj = md5(plaintext)
return md5_obj.hexdigest()
print(salted_password('123'))
参考解密writeup:http://www.shiyanbar.com/ctf/writeup/3968
因为md5加密很难暴力破解,看了writeup的意思是猜测它的密码是6位数的小写字母加密,然后使用小写字母表进行笛卡尔乘积,得到所有有可能出现的组合,将这些组合加盐后全部进行md5加密,将加密后的结果比对原题目中给出的密码,从而找到加密明文。
按照上述思路,写出解密代码:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import itertools as its
import hashlib
def unsalted_password(str_letter):
r = its.product(str_letter, repeat=6)
for j in r:
plaintext = "".join(j) #连接成字符串
plaintext = "%s%s" % (plaintext, '5948') #把盐加到明文的后面 每次生成的最终明文
md5_obj = hashlib.md5(plaintext)
text = md5_obj.hexdigest() #将所有的明文都进行md5加密,与最后的密码进行比对
if text=='81bdf501ef206ae7d3b92070196f7e98':
print plaintext
break
str_letter="abcdefghijklmnopqrstuvwxyz"
unsalted_password(str_letter)
但是太慢了,因为我看了writeup知道flag是sniper,如果把答案代入,把str_letter设为“sniper”,是可以很快跑出来的,所以猜测可能是我电脑性能低的原因,所有小写字母都来一遍太占内存,经过很长时间才得到flag
image.png