53.实验吧——try them all

题目:http://www.shiyanbar.com/ctf/1981

53.实验吧——try them all_第1张图片
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

53.实验吧——try them all_第2张图片
image.png

你可能感兴趣的:(53.实验吧——try them all)