picoCTF - RE - keygenme-py writeup

这道题没什么意思……把代码里面一部分内容摘出来跑一下就可以了。
它可能主要的意图是让我们学习一下 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)

心得:

  1. python 的 hashlib 库。b"ANDERSON" 完整的 hexdigest 是 31250184996c31741ab6ae8452c205deb7dbf431c5bdba21dea5f1289b646bfa
  2. 为什么 hash 输入的是 bytes,提示有给出答案:Unicode-objects must be encoded before hashing。字符串需要先编码得到可以表示成二进制的形式,这样才是可以运算的“数字”。

python 有两种 encode 方法,第二种似乎更常用。第一种是在调用构造函数,意图不是那么直接和明显:

b = bytes(mystring, 'utf-8')
b = mystring.encode('utf-8')
上一篇:commons-pool2 实现 sftp 连接池


下一篇:常用Maven包