题目

1
2
3
4
小明养成了定期修改密码的好习惯,同时,他还是一个CTF爱好者。有一天,他突发奇想,用flag格式来设置密码,为了防止忘记密码,他还把密码进行了md5加密。为了避免被其他人看到全部密码,他还特意修改了其中部分字符为#。你能猜出他的密码吗?
plaintext = flag{#00#_P4ssw0rd_N3v3r_F0rg3t_63####}
md5 = ac7f4d52c3924925aa9c8a7a1f522451
PS: 第一个#是大写字母,第二个#是小写字母,其他是数字。

思路
MD5 是一种哈希函数,特点是:

任意输入 → 固定 128 bit(32位十六进制)输出
不可逆:无法从哈希值反推原文
确定性:相同输入永远得到相同输出
利用确定性来验证结果得到flag

EXP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import hashlib
import itertools
import string

key='ac7f4d52c3924925aa9c8a7a1f522451'
c='flag{#00#_P4ssw0rd_N3v3r_F0rg3t_63####}'
c=c.split('#')
#用'#'把c分割开
print(c)
dir='1234567890'
#笛卡尔积,0-9选4个进行排列组合10^4个
dir_list=itertools.product(dir,repeat=4)
a=string.ascii_lowercase #a-z
b=string.ascii_uppercase #A-z

#拼接
for j in dir_list:
for i in a:
for k in b:
m=c[0]+''.join(k)+c[1]+''.join(i)+c[2]+''.join(j)+c[-1]
hash=hashlib.md5()
hash.update(bytes(m,encoding='utf-8'))
res=hash.hexdigest()
if res==key:
print(m)
print(res)
exit(0)