defextract_nested_zip(zip_path, extract_to=None): """ 简化版的嵌套zip解压函数 """ if extract_to isNone: extract_to = os.path.dirname(zip_path) print(f"解压: {zip_path}") try: with zipfile.ZipFile(zip_path, 'r') as zip_ref: zip_ref.extractall(extract_to)
# 删除源文件 os.remove(zip_path)
# 查找并解压嵌套的zip文件 for root, dirs, files in os.walk("./"): for file in files: if file.endswith('.zip'): nested_zip_path = os.path.join(root, file) extract_nested_zip(nested_zip_path) except Exception as e: print(f"解压失败: {str(e)}")
# 使用示例 if __name__ == "__main__": zip_file = input("请输入zip文件路径: ") if os.path.exists(zip_file): extract_nested_zip(zip_file) print("解压完成!") else: print("文件不存在")
classMultiWordleSolver: def__init__(self, pattern_str, word_list_path='word_list.txt'): """ 初始化 Solver :param pattern_str: 类似 "■■■■■_■■■■■" 的字符串 :param word_list_path: 单词表路径 """ # 解析 pattern,获取每个 slice 的长度 # 例如 "■■■■■_■■■" -> [5, 3] self.slice_lengths = [len(s) for s in pattern_str.split('_')] self.num_slices = len(self.slice_lengths) # 加载单词库 self.all_words = self._load_words(word_list_path) # 为每个 slice 初始化候选词列表 # self.candidates[i] 存储第 i 个 slice 所有可能的单词 self.candidates = [] for length inself.slice_lengths: if length inself.all_words: self.candidates.append(self.all_words[length][:]) else: raise ValueError(f"Word list does not contain words of length {length}") # 记录必须要包含的字母(用于优化猜测,非强制过滤) self.must_contain_global = set() # 记录已经确定位置的字母 (用于显示) self.confirmed_grid = [["■"] * l for l inself.slice_lengths]
def_load_words(self, path): """加载单词并按长度分组""" words_by_len = collections.defaultdict(list) try: withopen(path, 'r', encoding='utf-8') as f: for line in f: word = line.strip().upper() if word.isalpha(): words_by_len[len(word)].append(word) except FileNotFoundError: print(f"Error: {path} not found. Please ensure the file exists.") exit(1) return words_by_len
defget_guess(self): """ 生成猜测。 策略:从每个 slice 的候选词中选择一个最能排除干扰的词。 (这里使用简单的随机+频率策略,避免计算全量熵以保证速度) """ guess_parts = [] for i inrange(self.num_slices): candidates = self.candidates[i] ifnot candidates: print(f"Error: No candidates left for slice {i+1}!") returnNone # 简单的启发式:优先选择包含尚未确认的高频字母的词 # 如果候选词很少,直接随机选 iflen(candidates) > 1000: guess_parts.append(random.choice(candidates)) else: # 这里的逻辑可以优化为 min-max 策略,但对于多词拼接,随机选通常足够快 guess_parts.append(random.choice(candidates)) return"_".join(guess_parts)
defprocess_feedback(self, guess_str, feedback_str): """ 根据反馈更新候选列表 :param guess_str: 猜测的字符串 (如 "APPLE_PEAR") :param feedback_str: 反馈字符串 (如 "gbbby_bbgg") """ # 1. 预处理输入,移除分隔符以便对齐处理 raw_guess = [c for c in guess_parts(guess_str)] # list of strings raw_feedback = [c for c in guess_parts(feedback_str)] # list of strings # 将输入展平成带索引的结构,方便处理全局约束 # flat_guess: [('A', 'g', slice_idx, char_idx), ('P', 'y', ...)...] flat_info = [] g_parts = guess_str.split('_') f_parts = feedback_str.split('_') iflen(g_parts) != len(f_parts): print("Error: Feedback length does not match guess length.") return
whileTrue: # 1. 生成猜测 guess = solver.get_guess() ifnot guess: print("Solver failed: No words left. Check your input or word list.") break print(f"\nSolver Guess: {guess}") # 2. 获取反馈 feedback = input("请输入 Feedback (g=green, y=yellow, b=black, _=sep): ").strip().lower() # 检查是否成功 ifall(c in ['g', '_'] for c in feedback): print(f"Success! The word is {guess}") break # 3. 处理反馈 solver.process_feedback(guess, feedback)
from pwn import * import re
defdecode_feedback(feedback_str): """ 将服务器返回的反馈转换为 g/y/b 格式字符串,依据为ansi颜色码,保留_字符 假设服务器返回格式为b'\x1b[93mS\x1b[0m\x1b[92mI\x1b[0m\x1b[93mN\x1b[0m\x1b[93mG\x1b[0m\x1b[90mL\x1b[0m\x1b[93mE\x1b[0m_\x1b[93mE\x1b[0m\x1b[93mN\x1b[0m\x1b[93mT\x1b[0m\x1b[93mR\x1b[0m\x1b[93mA\x1b[0m\x1b[90mN\x1b[0m\x1b[93mC\x1b[0m\x1b[90mE\x1b[0m_\x1b[93mR\x1b[0m\x1b[93mI\x1b[0m\x1b[92mC\x1b[0m\x1b[93mH\x1b[0m\x1b[90mA\x1b[0m\x1b[92mR\x1b[0m\x1b[93mD\x1b[0m\x1b[90mS\x1b[0m\x1b[93mO\x1b[0m\x1b[90mN\x1b[0m\n' """ feedback = "" parts = feedback_str.decode().split('_') for part in parts: # 使用正则表达式提取每个字符的颜色码 matches = re.findall(r'\x1b\[(\d+)m.(?:\x1b\[0m)', part) for code in matches: code = int(code) if code == 92: # Green feedback += 'g' elif code == 93: # Yellow feedback += 'y' elif code == 90: # Black/Grey feedback += 'b' feedback += '_' return feedback.rstrip('_')
# 检查是否成功 ifall(c in ['g', '_'] for c in feedback): print(f"Success! The word is {guess}") # break sh.interactive() return # 3. 处理反馈 solver.process_feedback(guess, feedback)
def_vec_poly_mul(v0, v1): def_poly_mul(a, b): res = np.convolve(a, b) for i inrange(n, len(res)): res[i - n] = (res[i - n] - res[i]) % q return res[:n] % q returnsum((_poly_mul(a, b) for a, b inzip(v0, v1))) % q
defencrypt(A, t, m_b, r, e_1, e_2): A_T = list(map(list, zip(*A))) u = np.array([(mat + err) % q for mat, err in zip([_vec_poly_mul(row, r) for row in A_T], e_1) ]) tr = _vec_poly_mul(t, r) m = (m_b * ((q + 1)//2)) % q v = (tr + e_2 + m) % q return u, v
# ---------- Key generation ---------- A = np.array([np.array([np.random.randint(0, q, n) for _ inrange(k)]) for _ inrange(k)]) s = np.array([_small_noise(n, n*2//3) for _ inrange(k)]) e = np.array([_small_noise(n) for _ inrange(k)]) t = np.array([(_vec_poly_mul(row, s) + err) % q for row, err inzip(A, e)])
# ---------- Encryption ------------- r = [_small_noise(n) for _ inrange(k)] e_1 = [_small_noise(n) for _ inrange(k)] e_2 = _small_noise(n)
#!/usr/bin/env -S python3 -u import os import numpy as np from math import sqrt # no need quantum libraries here, only linear algebra. from scipy.stats import unitary_group
defstring_to_bits(s): bits = [] for byte in s: for i inrange(8): bits.append((byte >> (7 - i)) & 1) return bits
defbit_to_qubit(bit): if bit == 0: return np.array([1,0]) # |0> else: return np.array([0, 1]) # |1>
defmeasurement(cipher): measured_bits = [] for qubit in cipher: prob_0 = qubit[0]*qubit[0].conjugate()
if np.random.rand() < prob_0: measured_bits.append(0) else: measured_bits.append(1) return measured_bits
defbits_to_string(bits): bytes_list = [] for i inrange(0, len(bits), 8): byte = 0 for j inrange(8): byte = (byte << 1) | bits[i + j] bytes_list.append(byte) returnbytes(bytes_list) ####################################################################################
FLAG = b"EPFL{FAKEFLAAAAAAAG}}" n = len(FLAG) key = os.urandom(n) x = unitary_group.rvs(2)
print("Welcome to the Quantum Vernam Cipher Encryption! Key and flag have same length, try to break perfect secrecy if you can.") print("\n") print('The qubits will be encrypted with the matrix x = ',x) print("\n") print("You can apply any gate you want to the qubits before and after measurement as a 2X2 matrix, choose your favorite one :)") print("\n") print("Also pls remember that in python, j is the imaginary unit, not i.") print('\n') print('Enter coefficients for the first matrix that will be applied BEFORE encryption:') print('Enter first matrix element:') a1 = complex(input()) print('Enter second matrix element:') b1 = complex(input()) print('Enter third matrix element:') c1 = complex(input()) print('Enter fourth matrix element:') d1 = complex(input())
gate1 = np.array([(a1,b1),(c1,d1)])
print('\n') print('Enter coefficients for the second matrix that will be applied AFTER encryption:') print('Enter first matrix element:') a2 = complex(input()) print('Enter second matrix element:') b2 = complex(input()) print('Enter third matrix element:') c2 = complex(input()) print('Enter fourth matrix element:') d2 = complex(input())
gate2 = np.array([(a2,b2),(c2,d2)])
# vérifie que les matrices sont unitaires defis_unitary(matrix): identity = np.eye(matrix.shape[0]) return np.allclose(matrix.conj().T @ matrix, identity)
assert is_unitary(gate1), "Gate 1 is not unitary!" assert is_unitary(gate2), "Gate 2 is not unitary!"
deflist_unknown_boxes(): unknown_boxes = [] for i inrange(1,101): if global_box_map[i] == 0: unknown_boxes.append(i) return unknown_boxes
defgenerate_guess(player_num): # find which box has player_num box_num = -1 for i inrange(len(global_box_map)): if global_box_map[i] == player_num: box_num = i break
print(f"Generating guess for player {player_num}, box_num={box_num}") unknown_boxes = list_unknown_boxes() if box_num == -1:# oh no payload= f""" idk = [{','.join(map(str, unknown_boxes))}] for box in idk: print(box) EOF """ else: payload= f""" idk = [{','.join(map(str, unknown_boxes[0:min(45, len(unknown_boxes))]))}] for box_num in idk: print(box_num) print({box_num}) EOF """ print(f"Generated payload:\n{payload}") return payload
defline(linedata): print(linedata, end='') #parse "The box 1 contains number 29" m = re.match(r"The box (\d+) contains number (\d+)", linedata) if m: box_num = int(m.group(1)) number = int(m.group(2)) global_box_map[box_num] = number # parse "Provide Python script for player 2 (end with string 'EOF' on its own line):" m = re.match(r"Provide Python script for player (\d+) \(end with string 'EOF' on its own line\):", linedata) if m: player_num = int(m.group(1)) script=generate_guess(player_num) sh.sendline(script)
<channel> <title>W3Schools Home Page</title> <link>https://www.w3schools.com</link> <description>Free web building tutorials</description> <item> <title>RSS Tutorial</title> <link>https://www.w3schools.com/xml/xml_rss.asp</link> <description>New RSS tutorial on W3Schools</description> </item> <item> <title>XML Tutorial</title> <link>https://www.w3schools.com/xml</link> <description>New XML tutorial on W3Schools</description> </item> </channel>
// Check if logged in if (isset($_SESSION['loggedin']) && $_SESSION['loggedin'] === true) { if (file_exists('/flag.txt')) { $flag = file_get_contents('/flag.txt'); } else { $flag = "flag{test_flag_placeholder}"; // Fallback for local testing if docker not running } } ?>