BFS
广度优先搜索
尝试一个条件中所有可能的方法 运行量大
还有简单的可以控制外层循环
check = [0x2, 0x18, 0xf, 0xf8, 0x19, 0x4, 0x27, 0xd8, 0xeb, 0x0, 0x35, 0x48, 0x4d, 0x2a, 0x45, 0x6b, 0x59, 0x2e, 0x43, 0x1, 0x18, 0x5c, 0x9, 0x9, 0x9, 0x9, 0xb5, 0x7d]
# 我们用一个 solutions 列表存储当前所有可能的合法字符串前缀
# 初始状态只有最后一位字符 f27
solutions = [[check[27]]]
# 从第 26 位一直推到第 0 位(这本质上就是 BFS)
for step in range(26, -1, -1):
new_solutions = []
for partial_flag in solutions:
# partial_flag[0] 永远是上一次循环确定的那个字符
last_char = partial_flag[0]
for i in range(32, 128):
# 你的加密公式逻辑
if (i ^ 0x19) ^ (i % 0x11 + last_char) == check[step]:
# 如果匹配,把新字符插在列表最前面,形成新的可能路径
new_solutions.append([i] + partial_flag)
solutions = new_solutions
# 打印最终结果
for sol in solutions:
print("".join(map(chr, sol)))
哈哈哈哈哈哈哈 极致的循环 这个怎么说呢 就很简单但又很难 所有的算法逆向都可以这样来爆破
check = [0x2, 0x18, 0xf, 0xf8, 0x19, 0x4, 0x27, 0xd8, 0xeb, 0x0, 0x35, 0x48, 0x4d, 0x2a, 0x45, 0x6b, 0x59, 0x2e, 0x43, 0x1, 0x18, 0x5c, 0x9, 0x9, 0x9, 0x9, 0xb5]
f27 = 0x7d
for f26 in range(32, 128):
if (f26 ^ 0x19) ^ (f26 % 0x11 + f27) == check[26]:
for f25 in range(32, 128):
if (f25 ^ 0x19) ^ (f25 % 0x11 + f26) == check[25]:
for f24 in range(32, 128):
if (f24 ^ 0x19) ^ (f24 % 0x11 + f25) == check[24]:
for f23 in range(32, 128):
if (f23 ^ 0x19) ^ (f23 % 0x11 + f24) == check[23]:
for f22 in range(32, 128):
if (f22 ^ 0x19) ^ (f22 % 0x11 + f23) == check[22]:
for f21 in range(32, 128):
if (f21 ^ 0x19) ^ (f21 % 0x11 + f22) == check[21]:
for f20 in range(32, 128):
if (f20 ^ 0x19) ^ (f20 % 0x11 + f21) == check[20]:
for f19 in range(32, 128):
if (f19 ^ 0x19) ^ (f19 % 0x11 + f20) == check[19]:
for f18 in range(32, 128):
if (f18 ^ 0x19) ^ (f18 % 0x11 + f19) == check[18]:
for f17 in range(32, 128):
if (f17 ^ 0x19) ^ (f17 % 0x11 + f18) == check[17]:
for f16 in range(32, 128):
if (f16 ^ 0x19) ^ (f16 % 0x11 + f17) == check[16]:
for f15 in range(32, 128):
if (f15 ^ 0x19) ^ (f15 % 0x11 + f16) == check[15]:
for f14 in range(32, 128):
if (f14 ^ 0x19) ^ (f14 % 0x11 + f15) == check[14]:
for f13 in range(32, 128):
if (f13 ^ 0x19) ^ (f13 % 0x11 + f14) == check[13]:
for f12 in range(32, 128):
if (f12 ^ 0x19) ^ (f12 % 0x11 + f13) == check[12]:
for f11 in range(32, 128):
if (f11 ^ 0x19) ^ (f11 % 0x11 + f12) == check[11]:
for f10 in range(32, 128):
if (f10 ^ 0x19) ^ (f10 % 0x11 + f11) == check[10]:
for f9 in range(32, 128):
if (f9 ^ 0x19) ^ (f9 % 0x11 + f10) == check[9]:
for f8 in range(32, 128):
if (f8 ^ 0x19) ^ (f8 % 0x11 + f9) == check[8]:
for f7 in range(32, 128):
if (f7 ^ 0x19) ^ (f7 % 0x11 + f8) == check[7]:
for f6 in range(32, 128):
if (f6 ^ 0x19) ^ (f6 % 0x11 + f7) == check[6]:
for f5 in range(32, 128):
if (f5 ^ 0x19) ^ (f5 % 0x11 + f6) == check[5]:
for f4 in range(32, 128):
if (f4 ^ 0x19) ^ (f4 % 0x11 + f5) == check[4]:
for f3 in range(32, 128):
if (f3 ^ 0x19) ^ (f3 % 0x11 + f4) == check[3]:
for f2 in range(32, 128):
if (f2 ^ 0x19) ^ (f2 % 0x11 + f3) == check[2]:
for f1 in range(32, 128):
if (f1 ^ 0x19) ^ (f1 % 0x11 + f2) == check[1]:
for f0 in range(32, 128):
if (f0 ^ 0x19) ^ (f0 % 0x11 + f1) == check[0]:
print(''.join(map(chr, [ f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27])))
评论