... | XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX 01 ... | XX XX XX XX XX XX XX XX XX XX XX XX XX XX 02 02 ... | XX XX XX XX XX XX XX XX XX XX XX XX XX 03 03 03 ... | XX XX XX XX XX XX XX XX XX XX XX XX 04 04 04 04 ... | XX XX XX XX XX XX XX XX XX XX XX 05 05 05 05 05 ... | XX XX XX XX XX XX XX XX XX XX 06 06 06 06 06 06 ... | XX XX XX XX XX XX XX XX XX 07 07 07 07 07 07 07 ... | XX XX XX XX XX XX XX XX 08 08 08 08 08 08 08 08 ... | XX XX XX XX XX XX XX 09 09 09 09 09 09 09 09 09 ... | XX XX XX XX XX XX 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a ... | XX XX XX XX XX 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b ... | XX XX XX XX 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c ... | XX XX XX 0d 0d 0d 0d 0d 0d 0d 0d 0d 0d 0d 0d 0d ... | XX XX 0e 0e 0e 0e 0e 0e 0e 0e 0e 0e 0e 0e 0e 0e ... | XX 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f ... | 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
from base64 import * from Crypto.Random import get_random_bytes from Crypto.Cipher import AES from Crypto.Util.number import * import os import string from hashlib import sha256 import socketserver import signal import random # flag = os.getenv('FLAG').encode()
AES.block_size=16 iv = get_random_bytes(AES.block_size) key = get_random_bytes(16)
# 工作量证明 defcrack_proof_of_work(proof4:str,_hexdigest:str) -> bytes: from hashlib import sha256 print("Task get: ",proof4,_hexdigest) import string alphabet = string.ascii_letters+string.digits for a in alphabet: for b in alphabet: for c in alphabet: for d in alphabet: if sha256((a+b+c+d+proof4).encode()).hexdigest() == _hexdigest: print(f"proof of work cracked: {a}{b}{c}{d}") return (a+b+c+d).encode()
# 连接远程主机 s = remote("127.0.0.1", 4444) proof_of_work_problem = s.recvline(keepends=False).decode() print(s.recv()) # b'[+] Plz tell me XXXX: ' proof_of_work_answer = crack_proof_of_work(proof_of_work_problem[16:32],proof_of_work_problem[37:101]) s.sendline(proof_of_work_answer) print(s.recvline(keepends=True)) # b'secret:\n' encbase64bytes = s.recvline(keepends=False) print(s.recv()) # b'What can I say?\n> '
flag = ''
for N in [0,16,32]: # 原题密文去掉IV向量就只有48字节分3段,按实际情况更改 middle_list = [0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0] attack_list = [0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0] attack_list.extend(list(b64decode(encbase64bytes))[16+N:32+N]) s.send(b64encode(bytes(attack_list))) for index inrange(15,-1,-1): for i inrange(256): attack_list[index] = i s.send(b64encode(bytes(attack_list))) res = s.recvline(keepends=False) # print(res) _ = s.recv() if res != b'Man': break if index == 0: print(f"Got one bit! {index}",end=' \r') middle_list[index] = attack_list[index] ^ (16-index) break attack_list[index-1] ^= 0x0f# 反转比特 验证 s.send(b64encode(bytes(attack_list))) res = s.recvline(keepends=False) # print(res) _ = s.recv() if res != b'Man': print(f"Got one bit! {index}",end='\r') middle_list[index] = attack_list[index] ^ (16-index) # 初始化下一padding for j inrange(index,16): attack_list[j] = middle_list[j] ^ (16-index+1) index -= 1 else: # 没想好怎么写这个分支,反正一般用不着吧( pass flag_ = bytes([middle_list[i] ^ list(b64decode(encbase64bytes))[0+N:16+N][i] for i inrange(16)]).decode() flag += flag_ print(f"\nflag got: {flag_} \n {flag}")