math [一血]
题目:
from Crypto.Util.number import *
from hashlib import md5
flag = "XXX"
assert len(flag) == 14
pad = bytes_to_long(md5(flag).digest())
hack = 0
for char in flag:
hack+= pad
hack*= ord(char)
print hack
#hack = 64364485357060434848865708402537097493512746702748009007197338675
#flag_to_submit = "flag{" + flag + "}"
根据题目,首先hack通过分解,得到了多个因子
hack = pad * last_char * (1 + ...+n)
pad = (min_md5,max_md5)
直接爆破hack的值,对每个值进行计算
解密脚本如下
#python2
from Crypto.Util.number import *
from hashlib import md5
from itertools import combinations
len_flag = 14
hack = 64364485357060434848865708402537097493512746702748009007197338675
raw_input()
def get_all_candidate(hack):
return [chr(i) for i in range(32, 129) if hack % i == 0]
def backtrack(i, h, p, ans, deep):
if h < 0:
return False
if len(ans) > len_flag:
return False
if h / ord(i) == p and p == bytes_to_long(md5(ans[::-1]).digest()):
print ans[::-1]
raw_input()
return True
candidate = get_all_candidate(h/ord(i) - p)
if not candidate:
return False
else:
done = False
for j in candidate:
if not backtrack(j, h/ord(i) - p, p, ans + j, deep + 1):
pass
else:
done = True