一般就是使用爆破法。
-
模反演:对于模数 m 和整数 a,如果存在整数 b 使得 (a * b) % m = 1,那么 b 就是 a 在模 m 下的乘法逆元。可以使用扩展欧几里得算法来计算模反演。
-
模逆:对于模数 m 和整数 a,如果存在整数 b 使得 (a + b) % m = 0,那么 b 就是 a 在模 m 下的加法逆元。
from math import factorial from functools import reduce flag = "flag{xxxxxxxxx}" def mooooo(s: str): res = 0 for i in s: res <<= 8 res += ( factorial(ord(i)) % 233 ) return res table = "abcdefghijklmnopqrstuvwxyz{}" assert(reduce(lambda p,i:(i in table)*p, flag, True)) print(mooooo(flag)) # output: 2508450541438803643416583335895451914701844680466330955847
from math import factorial # 已知的输出值 output = 2508450541438803643416583335895451914701844680466330955847 # 逆向mooooo函数的逻辑 def inverse_mooooo(output): s = "" while output > 0: # 从output中获取最右侧的8位 char_val = output & 0xFF # 查找对应的字符,通过遍历所有可能的字符并计算其阶乘对233取模 for char in "abcdefghijklmnopqrstuvwxyz{}": if (factorial(ord(char)) % 233) == char_val: s = char + s # 将找到的字符添加到结果字符串的前面 break # 左移8位以处理下一个字符 output >>= 8 return s # 使用inverse_mooooo函数尝试恢复flag flag = inverse_mooooo(output) print(flag) # 输出应该是原始的flag字符串 #flag{dalaodalaohaolihai}
BugKu Ez_Fibon
ef = [0x64, 0x79, 0x6E, 0x76, 0x46, 0x55, 0x7B, 0x6D, 0x40, 0x5E, 0x6D, 0x63, 0x74, 0x51, 0x6D, 0x56, 0x53, 0x7E, 0x77, 0x65, 0x6E, 0x72]
fibon = [0 for i in range(22)]
fibon[0] = 2 #构造斐波那契数列
fibon[1] = 3
for i in range(2, 22):
fibon[i] = fibon[i - 1] + fibon[i - 2]
for i in range(len(ef)):
for f in range(0x40, 0x7F): #构造每一位可能的flag
if ( (i & 1) != 0 ):
tmp = (fibon[i] + i + f) % 64 + 64
else:
tmp = (fibon[i] + i + f) % 64 + 64
if ( tmp == ef[i] ): #如何构造加密后与密文相同
print(chr(f), end = "") #就输出遍历到的值
break
fibon=[0]*22:
fibon=[0 for _ in range(22)]
fibon=[0 for i in range(22)]