from Crypto.Util.number import * import socketserver import socket
defsplit_master(B_decimal, segment_bits): iflen(segment_bits) < 3: raise ValueError("no") ifsum(segment_bits) != 512: raise ValueError("no") n = len(segment_bits) found_combination = None for k inrange(n,1,-1): from itertools import combinations for indices in combinations(range(n), k): ifsum(segment_bits[i] for i in indices) > 30: continue
valid = True for i inrange(len(indices)): for j inrange(i+1, len(indices)): ifabs(indices[i] - indices[j]) <= 1: valid = False break ifnot valid: break ifnot valid: continue
if0in indices and (n-1) in indices: continue ifany(segment_bits[i]>=25for i in indices): continue found_combination = indices break if found_combination isnotNone: break if found_combination isNone: raise ValueError("no") binary_str = bin(B_decimal)[2:].zfill(512) iflen(binary_str) > 512: raise ValueError("no")
segments_binary = [] start = 0 for bits in segment_bits: end = start + bits segments_binary.append(binary_str[start:end]) start = end segments_decimal = [int(segment, 2) for segment in segments_binary] return [segments_decimal[i] for i in found_combination]
classTask(socketserver.BaseRequestHandler): 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()
defhandle(self): # 设置socket超时而不是使用signal.alarm self.request.settimeout(90) # 90秒超时 try: flag = b'WMCTF{test}' self.send(b"Welcome to WMCTF2025") key = getPrime(512) print(key) q = getPrime(512) self.send(b"q:"+str(q).encode()) for i inrange(20): a = getPrime(512) b = a * key % q gift = split_master(b, list(map(int, self.recv(b"> ").split()))) self.send(b"a:"+str(a).encode()) self.send(b"gift:"+str(gift).encode()) x = self.recv(b"the key to the flag is: ").decode() if x == str(key): self.send(flag) except socket.timeout: self.send(b"Time's up!") finally: self.request.close() # 确保连接被关闭
# --- 连接服务器 --- log.info(f"Connecting to {HOST}:{PORT}...") try: sh = remote(HOST, PORT) log.success("Connection established!") except PwnlibException as e: log.error(f"Failed to connect: {e}") log.error("Please make sure task.py is running in another terminal window!") exit()
defsplit_master(B_decimal, segment_bits): iflen(segment_bits) < 3: raise ValueError("no") ifsum(segment_bits) != 512: raise ValueError("no") n = len(segment_bits) found_combination = None for k inrange(n,1,-1): from itertools import combinations for indices in combinations(range(n), k): ifsum(segment_bits[i] for i in indices) > 30: continue
valid = True for i inrange(len(indices)): for j inrange(i+1, len(indices)): ifabs(indices[i] - indices[j]) <= 1: valid = False break ifnot valid: break ifnot valid: continue
if0in indices and (n-1) in indices: continue ifany(segment_bits[i]>=25for i in indices): continue
found_combination = indices break if found_combination isnotNone: break if found_combination isNone: raise ValueError("no") binary_str = bin(B_decimal)[2:].zfill(512) iflen(binary_str) > 512: raise ValueError("no")
segments_binary = [] start = 0 for bits in segment_bits: end = start + bits segments_binary.append(binary_str[start:end]) start = end segments_decimal = [int(segment, 2) for segment in segments_binary] return [segments_decimal[i] for i in found_combination]
from random import choice, sample from Crypto.Cipher import AES from hashlib import md5 from secret import flag
m, n = 90, 64 p = 1048583
E = sample(range(1, p), 3) s = random_vector(Zmod(p), n) A = random_matrix(Zmod(p), m, n) e = vector(Zmod(p), [choice(E) for i inrange(m)]) b = A*s + e
from Crypto.Cipher import AES from ast import literal_eval from random import choice from hashlib import md5 from secret import flag
defcheck(E): assertlen(set([_ % p for _ in E])) == 5 L = block_matrix(ZZ, [ [Matrix(ZZ, E)], [Matrix(ZZ, [1]*5)], [p] ]) E_ = L.LLL()[3] returnmax([abs(_) for _ in E_]) > 1337andmin([abs(_) for _ in E_]) > 337 p = 1048583 E = literal_eval(input("your error plz :)")) assert check(E)
m, n = 90, 56 s = random_vector(Zmod(p), n) A = random_matrix(Zmod(p), m, n) e = vector(Zmod(p), [choice(E) for i inrange(m)]) b = A*s + e