1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
| import sys
sys.setrecursionlimit(5000)
matrix_source=[...] result_source=[1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1]
def solve(): if not matrix_source or not result_source: print("错误:请先在脚本顶部的 matrix_source 和 result_source 中填入数据!") return
M = [[int(c) for c in row] for row in matrix_source] R = result_source[:] n = len(R) if len(M) != n: print(f"数据错误:矩阵行数 ({len(M)}) 与结果向量长度 ({n}) 不一致!") print("请检查是否完整复制了 matrix 列表。") return print(f"数据加载成功。正在解 {n} 元线性方程组 (GF(2))...")
aug = [M[i] + [R[i]] for i in range(n)]
for i in range(n): pivot = -1 for k in range(i, n): if aug[k][i] == 1: pivot = k break if pivot == -1: continue aug[i], aug[pivot] = aug[pivot], aug[i] for k in range(n): if k != i and aug[k][i] == 1: for j in range(i, n + 1): aug[k][j] ^= aug[i][j]
solution_bits = "".join(str(aug[i][n]) for i in range(n)) print("解密完成,得到二进制流。") print(f"二进制长度: {len(solution_bits)}") charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_{}" code_map = {} for c in charset: bits = bin(ord(c))[2:] code_map[bits] = c
found_flags = []
def decode_recursive(index, current_str): if index == len(solution_bits): found_flags.append(current_str) return
if index + 7 <= len(solution_bits): chunk = solution_bits[index : index+7] if chunk in code_map: decode_recursive(index + 7, current_str + code_map[chunk]) if index + 6 <= len(solution_bits): chunk = solution_bits[index : index+6] if chunk in code_map: decode_recursive(index + 6, current_str + code_map[chunk])
print("\n正在尝试解码文本...") prefix = "furryCTF{" start_ptr = 0 prefix_match = True for char in prefix: bits = bin(ord(char))[2:] if solution_bits.startswith(bits, start_ptr): start_ptr += len(bits) else: prefix_match = False break if prefix_match: print(f"前缀 '{prefix}' 匹配成功,加速解码中...") decode_recursive(start_ptr, prefix) else: print(f"警告:前缀 '{prefix}' 不匹配。尝试全量解码(可能会很慢或失败)...") decode_recursive(0, "")
print("\n" + "="*30) if found_flags: print("找到可能的 Flag:") for f in found_flags: print(f"-> {f}") best_flag = max(found_flags, key=len) print("\n推荐提交: " + best_flag) else: print("未找到符合字符集的 Flag,请检查 matrix 数据是否正确。") print("="*30)
if __name__ == '__main__': solve()
|