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() # 确保连接被关闭
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]
Q = diagonal_matrix(ZZ, [2^256, 2^156, 2^56, 2^74] + [2^192, 2^128]*nums + [1]*nums) L = L * Q L = L.LLL() L = L / Q
res = list(map(abs, L[0])) key = d + res[1] + 2^110*res[2] + 2^330*res[3] flag="WMCTF{"+md5(str(key).encode()).hexdigest()+"}" print(flag)
#WMCTF{ed27074de5c476e67328e04b6e27a5b8}
LW3
题目
题目描述:
1
LW:3
题目:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
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 random import randrange from Crypto.Util.number import getPrime
withopen('flag.txt') as f: FLAG = f.read().strip()
classflavorings: def__init__(self, p, l): self.l, self.p = l, p self.state = [randrange(p) for i inrange(l)] self.a = [randrange(128) for i inrange(l)] def__next__(self): s = choice([sum(self.state[i] ^ d * self.a[i] for i inrange(self.l)) % self.p for d inrange(1, 4)]) self.state = [s] + self.state[:-1] return s
classLemonPepper: def__init__(self, q, t, e1, e2, p, l): self.q, self.t, self.e1, self.e2 = q, t, e1, e2 self.mcg = flavorings(p, l) defLemon(self): q, t, e1, e2 = self.q, self.t, self.e1, self.e2 R.<x> = PolynomialRing(Zmod(q ^ e2)) roots = [randrange(q ^ (e2-e1)) + sum(next(self.mcg) * q ^ (i + t) for i inrange(e1))] + [randrange(q ^ e2) for i inrange(t - 1)] return randrange(q ^ e2) * prod([(x - root) ^ choice(range(2,5)) for root in roots]) defPepper(self): q, t, e = self.q, self.t, self.e2 R.<x> = PolynomialRing(Zmod(q ^ e)) roots = [next(self.mcg) * q ^ 130 + randrange(q ^ 130) + randrange(q ^ 70) * q ^ 131for i inrange(t)] return randrange(q ^ e) * prod([(x - root) * (x - root - q ^ t) for root in roots]) * prod([x - root - q ^ 40for root in sample(roots, 2)])
print("🍋 Precision Zest Injection!") for i inrange(7): print(lemonpepper.Lemon().list())
print("🌶️ Chaotic Spark Ignition!") for i inrange(3): print(lemonpepper.Pepper().list())
print("SHOVE PLATES INTO PORTAL! 🛸🍽️ VALIDATE 🍋🌶️ COMBO OR KITCHEN MELTDOWN! 💣💥") assert [int(i) for i ininput("> ").split(',')] == lemonpepper.mcg.state
from Crypto.Util.number import * from time import time from pwn import *
defsolvelemon(p, poly, e = 165): R.<x> = PolynomialRing(Zmod(p^e))
poly = R(poly) defgcd(x, y): whileTrue: x, y = y, x % y if y == 0: return x for i inrange(3): g = poly for j inrange(3-i): g = diff(g)
for j in gcd(poly,g).roots(multiplicities=False): ans = int(j) s = [] for _ inrange(165): s.append(int(ans % p)) ans //= p ifall([_ < 257for _ in s[30:]]): return s[30:] poly //= (x-j)^(i+1)
deflinearation(c): from tqdm import trange
p, n = 257, 25 R = PolynomialRing(GF(p),[f'x{i}'for i inrange(n)]) x = [i for i in R.gens()]+[1] dic = {} m = [] v = [] for i in trange(914): f = prod(sum(c[i:i+n][j]^d*x[j] for j inrange(n))-c[i+n] for d inrange(1,4)) for d1 inrange(n+1): vr, term = 0, x[d1] g = f*term coes, mons = g.coefficients(), g.monomials() mr = [0for i inrange(23750)] for mon,coe inzip(mons,coes): if mon == 1: vr = -coe continue if mon notin dic.keys(): dic[mon] = len(dic) mr[dic[mon]] = coe m.append(mr) v.append(vr) v = matrix(v) al = matrix(GF(p),m).T.solve_left(v).list() a = [] for i in x[:-1]: a.append(al[dic[i]]) return a defsolvepepper(poly, e = 165): R.<x> = PolynomialRing(Zmod(p^e)) f = R(poly) Qpp = Qp(p, prec=e) R.<x> = PolynomialRing(Qpp) re = R(f).roots() nexts = [] for i in re: ans = eval(str(i[0]).split('O')[0][:-3].replace('^','**')) if ans.bit_length() > 4000: nexts.append(int(ans%p^135)//p^134) return nexts[::2]
defguess(s, a, nexts, label): global ans if nexts == [-1]*25: ans = s print(1) nc = [sum(s[i] ^ d * a[i] for i inrange(30)) % 257for d inrange(1, 4)] for i in nc: if i in nexts: nexts1 = deepcopy(nexts) nexts1[nexts1.index(i)] = -1 guess([i]+s, a, nexts1, label) else: if label < 5: guess([i]+s, a, nexts, label+1)
from pwn import * context.log_level = 'error'
p = 27658548947 re = remote('',)
re.recvuntil(b'Injection!\r\n') s = [] for i inrange(7): s += solvelemon(p,eval(re.recvline())) print(s) a = linearation(s)[::-1] s = s[-25:][::-1]
re.recvuntil(b'Ignition!\r\n') for i inrange(3): nexts = solvepepper(eval(re.recvline())) global ans ans = [] guess(s,a,nexts,0) s = ans[:25]
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
gift = literal_eval(sh.recvline().strip().decode()[4:]) enc = literal_eval(sh.recvline().strip().decode()[4:])
p = 1048583 E = [259832, 985692, 628744, 767011, 478513] g = (725860, 184456) m, n = 90, 56 A = Matrix(Zmod(p), m, n, gift[:m*n]) b = vector(Zmod(p), gift[m*n:]) nums = 5
from Crypto.Util.number import * d = m
A_ker = A[:d].left_kernel().matrix() Fp = Zmod(p) V = Fp["".join(["x"+str(i)+", "for i inrange(d)]) + "".join(["y"+str(i)+", "for i inrange(d)]).strip(", ")] x, y = vector(V.gens()[:d]), vector(V.gens()[d:2*d])
XY = (Matrix(x).stack(Matrix(y))).T ve = vector(Zmod(p), g.list()) XYe = XY*ve
polys = A_ker*XYe - A_ker*(b[:d]-vector([E[0]]*d)) M, V = Sequence(polys).coefficients_monomials() M = M.T.dense_matrix()
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#################################################################### use reduction M1, M2 = M[:d-n], M[d-n:]
if(1): L = block_matrix(ZZ,[ [1, -M2*M1^(-1)], [0, p] ])