这道题没什么意思……把代码里面一部分内容摘出来跑一下就可以了。
它可能主要的意图是让我们学习一下 key 生成的过程?通过把名字 hash 一下,然后选择结果中某些位置的数字,组成了 key 的 dynamic 部分。
用到的主要就是下面这部分题目:
if key[i] != hashlib.sha256(username_trial).hexdigest()[4]:
return False
else:
i += 1
if key[i] != hashlib.sha256(username_trial).hexdigest()[5]:
return False
else:
i += 1
if key[i] != hashlib.sha256(username_trial).hexdigest()[3]:
return False
else:
i += 1
if key[i] != hashlib.sha256(username_trial).hexdigest()[6]:
return False
else:
i += 1
if key[i] != hashlib.sha256(username_trial).hexdigest()[2]:
return False
else:
i += 1
if key[i] != hashlib.sha256(username_trial).hexdigest()[7]:
return False
else:
i += 1
if key[i] != hashlib.sha256(username_trial).hexdigest()[1]:
return False
else:
i += 1
if key[i] != hashlib.sha256(username_trial).hexdigest()[8]:
return False
解题:
import hashlib
username_trial = b"ANDERSON"
key_part_static1_trial = "picoCTF{1n_7h3_|<3y_of_"
key_part_static2_trial = "}"
order = [4,5,3,6,2,7,1,8]
dynamic = ""
for i in range(8):
dynamic += hashlib.sha256(username_trial).hexdigest()[order[i]]
flag = key_part_static1_trial + dynamic + key_part_static2_trial
print(flag)
心得:
- python 的 hashlib 库。
b"ANDERSON"
完整的 hexdigest 是31250184996c31741ab6ae8452c205deb7dbf431c5bdba21dea5f1289b646bfa
。 - 为什么 hash 输入的是 bytes,提示有给出答案:Unicode-objects must be encoded before hashing。字符串需要先编码得到可以表示成二进制的形式,这样才是可以运算的“数字”。
python 有两种 encode 方法,第二种似乎更常用。第一种是在调用构造函数,意图不是那么直接和明显:
b = bytes(mystring, 'utf-8')
b = mystring.encode('utf-8')