ef = "BDADB4841063B3E1C6842D6FBA8874C49032EA2EC6286570C97578A00B9FA6" ef = bytearray.fromhex(ef) #变成16进制的字节数组
flag = [0for i inrange(32)] flag[31] = 0xC4 flags = []
# 其实就是异或存在多解 于是在0xFF中如有能恢复第一个字符的 就都整条恢复 defDeep_Search(flag, deep): if deep == 0: flags.append(flag.copy()) else: for i inrange(0xFF): if ((2 * (i ^ 0x13) + 7) ^ (i % 9 + flag[deep] + 2)) & 0xFF == ef[deep - 1]: #恢复第一个异或 flag[deep - 1] = i #赋值到flag Deep_Search(flag, deep - 1) #整条递归恢复
Deep_Search(flag, 31)
for flag in flags: for i inrange(31, -1, -1): for j inrange(int(i / 4) - 1, -1, -1): # for j in range(int(i / 4)): 两种都可以 # print(j, end = " ") flag[i] ^= flag[j] t = AES.new(key, AES.MODE_ECB).decrypt(bytes(flag)) print(t)
# 当一个数异或多个数时 如 a ^ b ^ c ^ d = e # 那么当他要反过来推回来 不管是正着异或 e ^ b ^ c ^ d 还是倒过来 e ^ d ^ c ^ b 答案都为 a
GetFlag!(buuoj上MD5加密后上交)
关于DFS扩展
本来想直接塞这篇博客,学习一番,决定单独出一篇放到Book里
About this Post
This post is written by P.Z, licensed under CC BY-NC 4.0.