之前一直觉得没有学,所以碰到不会的大概率都会划走。但想想,总该要面对的。
主要是自己太懒了:)。
1. 丢失的MD5
可以看出这段代码是在py2中运行的。
解出来的就是flag。
2.Alice与Bob
根据题目要求,将素数98554799767分解为101999和966233,并组成新的数101999966233,然后进行md5的32位小写哈希。
import hashlib
pd = 101999966233
flag = 'flag{' + hashlib.md5(str(pd).encode()).hexdigest() + '}'
print(flag)
3.Windows系统密码
windows下密码的格式:
Windows系统下的hash密码格式为:用户名称:RID:LM-HASH值:NT-HASH值
故将这几个hash值进行md5解密尝试,在第3个hash值处尝试成功
4.权限获得第一步
跟第3题是类似的。
5.异性相吸
异性相吸?猜测应该是异或吧。搜了一下,确实是异或。但是我一开始写的时候,计算了两个字符串的长度,len(s1) = 38,len(s2) = 19。两倍的关系,我以为是s2中的一个字符与s1中的两个字符(ord()字符化后相加再转成数字)进行异或,并不是;再然后尝试了整体(同上一个括号中的操作)进行异或,也不对。后来才想到了应该是二进制进行异或。
不过值得注意的是粘贴复制过来的会有差错:)。
from Crypto.Util.number import long_to_bytes,bytes_to_longwith open(r'key.txt','rb') as f:s1 = f.read()
s1 = bytes_to_long(s1)
print('s1 =',s1)
''' ss1 = 'asadsasdasdasdasdasdasdasdasdasdqwesqf' pd1 = str.encode(ss1) print('ss1 =',bytes_to_long(pd1)) '''
with open(r'cipher.txt','rb') as f:s2 = f.read()
s2 = bytes_to_long(s2)
print('s2 =',s2)#906620282978305788368917706917671540766368191598507869056223532353167665764726853132227611
''' ss2 = '???唒?塔屋?卖剄?堂??嘅均???' pd2 = str.encode(ss2) print('ss2 =',bytes_to_long(pd2))#9779571965693530265243919284564937911043110712797968067643010511308831972362658055906540274976809684837525929002499546901951655060 '''
flag = s1 ^ s2
print(long_to_bytes(flag))
6.还原大师
题目虽然给出的是不完整的字符串和MD5,但我们可以进行枚举字符串中缺失的部分,在于MD5的可见部分比对,从而选出最合适的。
不知道这个是不是md5加密之后,里面全为小写字母的原因,只好在进行判断时把字母小写化。