from hashlib import sha256 import socketserver from secret import FLAG import signal import string import random import os
flag = FLAG
classTask(socketserver.BaseRequestHandler):
ctry = 0
def_recvall(self): BUFF_SIZE = 2048 data = b'' whileTrue: part = self.request.recv(BUFF_SIZE) data += part iflen(part) < BUFF_SIZE: break return data.strip()
defproof_of_work(self): proof = self.sh.recvuntil(b'[+] Plz tell me XXXX:') #接收致至'[+] Plz tell me XXXX:',也就是接收第一排 tail = proof[16:32].decode() _hash = proof[37:101].decode() for i in product(table, repeat=4): #itertools.product,接受多个可迭代对象作为参数,并返回一个迭代器,该迭代器产生所有输入可迭代对象的笛卡尔积 #笛卡尔积就是四个位置所有table包含的字符排列组合,离散数学里的 head = ''.join(i) t = hashlib.sha256((head + tail).encode()).hexdigest() #注意是16进制 if t == _hash: self.sh.sendline(head.encode()) break
defproof_of_work(self): # [+] sha256(XXXX+JaakUDSfxkW0xjzV) == 4dbfdc61cb88f5bd08d87493ac62e5ab174780f5f019051f91df8b3c36564ed0 # [+] Plz tell me XXXX: proof = self.sh.recvuntil(b'[+] Plz tell me XXXX:') tail = proof[16:32].decode() _hash = proof[37:101].decode() for i in product(table, repeat=4): head = ''.join(i) t = hashlib.sha256((head + tail).encode()).hexdigest() if t == _hash: self.sh.sendline(head.encode()) break definteraction(self): flag = '' for i inrange(1,34): self.sh.sendline(str(i).encode()) #注意int不能直接encode() flag += self.sh.recvline().decode()[-2] print(flag)