YLCTF-Re-xorplus

die查看一下

elf64位

这里有key,下面也有提示是RC4

发现s是获取环境的,nc一下环境获取enc密文。

这里查看rc4初始化的内容,对比一下正常的RC4代码,为什么在第二个循环里面嵌套了多一个for循环呢

但是对比起来这里发现是在j=(j+s[i]+k[i])%256这里多加了一个1300

再查看加密部分

再次对比原来的两个代码段,发现这里多加了一个0x14,也就是20

思路:

就是在RC4初始化这里加多了一个1300,导致s盒和原来的不相同,逆向回来的时候也还是加1300,为什么呢,因为我们得到的s盒是要和我们的明文去异或的,异或再异或这个数等于不变

所以s盒的算法该加还是加

但是加密算法是加多了一个0x14,故逆向回去的时候则需要减去一个0x14

exp:如下

def swap(S, i, j):
    S[i], S[j] = S[j], S[i]


def rc4_init(K):
    S = list(range(256))
    T = [K[i % len(K)] for i in range(256)]
    j = 0

    for i in range(256):
        j = (j + S[i] + T[i] + 1300) % 256
        swap(S, i, j)

    return S


def rc4_crypt(S, Data):
    x = y = 0
    result = []

    for byte in Data:
        x = (x + 1) % 256
        y = (y + S[x]) % 256
        swap(S, x, y)
        t = (S[x] + S[y]) % 256
        # 使用相应的解密逻辑
        decrypted_byte = (byte - 20) ^ S[t]
        result.append(decrypted_byte)

    return result


def main():
    K = bytearray("welcometoylctf", 'utf-8')  # 密钥
    flag = bytearray([
        0x91, 0x86, 0x1b, 0x2d, 0x9e, 0x6f, 0x24, 0x26,
        0x7b, 0xa3, 0x98, 0xf1, 0xd2, 0x89, 0x22, 0x18,
        0x3a, 0xec, 0x30, 0x2d, 0x80, 0x2a, 0x46, 0x67,
        0x6c, 0x76, 0x53, 0x77, 0x51, 0x26, 0x0a, 0xeb,
        0x84, 0x79, 0x5c, 0xd1, 0xb6, 0x80, 0x5a, 0xf4,
        0xb8, 0x34, 0xa6
    ])

    S = rc4_init(K)  # 初始化 RC4
    decrypted_flag = rc4_crypt(S, flag)  # 解密 flag

    print("Decrypted flag:", ''.join(chr(b & 0xff) for b in decrypted_flag))  # 打印解密后的 flag


if __name__ == "__main__":
    main()

#Decrypted flag: YLCTF{a91a9f69-492f-45bb-a1e3-aeb1d52417e0}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值