CTF_RE模逆题

一般就是使用爆破法。

  1. 模反演:对于模数 m 和整数 a,如果存在整数 b 使得 (a * b) % m = 1,那么 b 就是 a 在模 m 下的乘法逆元。可以使用扩展欧几里得算法来计算模反演。

  2. 模逆:对于模数 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)] 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值