KCTF 2025

邪影显现

Solve

  1. 动调分析一下起始与结尾,输入name与code,之后比较enc(code)=='KCTF2025'+md5(name)
  2. code长度为48,并转为hex
    image|434x189
  3. 跟踪code的数据,可以看到第一次修改,在sub_455880函数,丢给gpt分析,发现是将hexstring(realbignum)以30bit一组存储在内存中(标准 MIRACL的bignum存储方式).
    注意这里的hexstring是真正的bignum以小端的顺序存放在内存中的.转化为30bit一组是为了进行大数运算
    image-2|595x517
  4. 通过字符串可以判断出使用的大数库,此题使用了很多种大数库,进行了多次rsa加密
    e = 3
    image-2|657x517
    e = 7
    image-3-1
  5. 分析出e=[3, 7, 11, 17, 19, 23, 29, 31, 37],动调得到n = 0x56F67550F16A00390DCF0B2715708E61C5B3F23101862FC1
    在线分解一下,得到p = 45424490472579293708671645907,q = 46942075831425428541187578011
    image-4
    image-6
  6. 密文为# KCTF2025+MD5("KCTF")
    Cipher =0x4b435446323032357a1ab1c6a2999f9797f5abd5b49fd9a0
  7. 每次解密第一个字节-1,逆e序解rsa即可

What I have learned

  1. 四种大整数结构
    from idc import get_bytes  
    def origin_data2bignum(data):# 标准 MIRACL 表示  
        bignum = 0  
        for i in range(len(data)):  
            r = data[i] & 0x3FFFFFFF  
            bignum |= r << (30 * i)  
        return bignum  
      
    def bignumat(addr): # 结构体里内联存放 digit 版本  
        digtsLen = int.from_bytes(get_bytes(addr, 4), 'little')  
        if digtsLen >= 0x1000:  
            return 0  
        digtsAddr = addr + 4  
        data = []  
        for i in range(digtsLen):  
            data.append(int.from_bytes(get_bytes(digtsAddr + i * 4, 4), 'little'))  
        return origin_data2bignum(data)  
      
    def bignum1at(addr): # 指针型结构(动态分配 digit 数组)  
        digitsAddr = int.from_bytes(get_bytes(addr, 4), 'little')  
        digitsLen = int.from_bytes(get_bytes(addr + 4, 4), 'little')  
        data = get_bytes(digitsAddr, digitsLen * 4)  
        return int.from_bytes(data, 'little')  
      
    def bignum3at(addr): #  
        digtsLen = int.from_bytes(get_bytes(addr, 4), 'little')  
        digtsAddr = int.from_bytes(get_bytes(addr + 0xc, 4), 'little')  
        data = []  
        for i in range(digtsLen):  
            data.append(int.from_bytes(get_bytes(digtsAddr + i * 4, 4), 'little'))  
        return origin_data2bignum(data)
    
  2. 模幂运算以及rsa加密解密.
  3. 识别大数库(miracl,cryptopp,mbedtls,mpir,wolfssl,pgpbig,ntllib,freelip,?noname)
  4. sagemath使用:
    • 启动sagemath notebook->new sagemath->编写代码即可
    • 启动sagemath notebook->new python->from sage.all import *
posted @ 2025-08-23 22:19  Un1corn  阅读(18)  评论(0)    收藏  举报