第六题
之前没做出来的一道题目,各种密码学的夹杂,看到很多.so库估计当时也没啥想法了
很明了,对输入进行检验,过了就输出right,错了就输出wrong,分析一下check_401510这个函数。先是判断字符范围,ASCII码不能超过90。
然后取输入的前5个字符,作md5加密,如下三个函数就是实现了md5算法
接下来就是用前五个字符的md5值的前8字节作为DES算法的key,并且采用ECB模式分组加密。
然后就是对DES加密后的结果作base64变换,v9是DES加密结果,v21保存base64结果。
最后就是和check数组比较,check数组内容即是:
‘OSHzTJ4pwFgRG6eS6y3xVOOEGcbE5rzwqTs7VCK6ACQLuiTamZpXcQ==’
所以采用爆破的方式去得到flag,设flag前五位为temp,并且用其md5值前8字节作为DES算法的key,当解密出来的flag前五位和temp相等时,即为flag。
脚本如下:(参考的大神writeup)
import pyDes
import base64
import hashlib
import string
check = "OSHzTJ4pwFgRG6eS6y3xVOOEGcbE5rzwqTs7VCK6ACQLuiTamZpXcQ=="
miwen = base64.b64decode(check)
count = 0
for i in string.uppercase + string.digits:
for j in string.uppercase + string.digits:
for k in string.uppercase + string.digits:
for m in string.uppercase + string.digits:
for n in string.uppercase + string.digits:
count = count + 1
tmp = i+j+k+m+n
md5_tmp = hashlib.md5(tmp).hexdigest()
key = md5_tmp[0:16].decode("hex")
result = pyDes.des(key)
y = result.decrypt(miwen[:8])
if y[0:5] == tmp:
print y
if count % 10000 == 0:
print count
这道题目主要就是各种密码算法的交杂,在代码的分析上比较困难,即使参照writeup也很难掌握,后面还得好好在琢磨琢磨