NSSCTF ROUND#28 Ciallo~(∠・ω )⌒☆ WriteUp

WriteUp

题目信息

来源:NSSCTF
名称:ROUND#28 Ciallo~(∠・ω )⌒☆
分类:Reverse
描述:无

题目链接: https://www.nssctf.cn/contest/732/

解题思路

首先使用DIE对文件进行查壳,发现这是一个无壳的64位exe文件。

于是使用64位IDA对文件进行反汇编,得到伪代码如下:

先一步步观察伪代码,

首先开始设置了一串Buf,我们暂且搁置;然后程序要求输入24位长度的字符串;接着v8数组设置了一些初始值,我们也暂且搁置;
再往后,我们发现我们输入的字符串被v11指针引用,然后通过tea_encrypt加密了;之后,又设置了一个v7并且被赋值了一个字符串;
然后通过rc4_init和rc4_crypt函数,得到Buf1;最后Buf1与Buf2比较,从而判断输入字符串的对错。

整体分析这份伪代码,通过函数名和函数的具体伪代码,其实可以猜想到我们的字符串先后通过TEA、RC4算法被加密,最后得到的密文与Buf2比对。
那么我们要的flag就可以根据Buf2先后通过RC4、TEA算法被解密得到。
其中RC4算法的密钥就是"harukaze",而TEA算法的密钥则是v8数组。

Key:
RC4:"harukaze"
TEA:[0x12345678, 0x9ABCDEF0, 0x2468ACE0, 0xF13579B3]

如此以来,我们便可以开始编写脚本来进行加密解密操作了,脚本如下:

def int_array_to_bytes(int_array):
    byte_list = []
    for num in int_array:
        byte_list.append(num.to_bytes((num.bit_length() + 7) // 8, 'little'))
    return b''.join(byte_list)


int_array = [0x22F1A4AB5685839C, 0xB54F2680858F71DE, 0x903E60C602476C37]
byte_str = int_array_to_bytes(int_array)
print(byte_str)

先将Buf2数组转换成字节串,方便后续操作
Buf2:b'\x9c\x83\x85V\xab\xa4\xf1"\xdeq\x8f\x85\x80&O\xb57lG\x02\xc6`>\x90'

def rc4(key):
    S = list(range(256))
    j = 0
    out = []

    # 将字符串密钥转换为整数序列
    key = [ord(c) for c in key]

    # 密钥调度算法(KSA)
    for i in range(256):
        j = (j + S[i] + key[i % len(key)]) % 256
        S[i], S[j] = S[j], S[i]

    return S


def rc4_encrypt(data, key):
    S = rc4(key)
    encrypted = []
    i = j = 0
    for byte in data:
        i = (i + 1) % 256
        j = (j + S[i]) % 256
        S[i], S[j] = S[j], S[i]
        k = S[(S[i] + S[j]) % 256]
        encrypted.append(byte ^ k)
    return bytes(encrypted)


def rc4_decrypt(data, key):
    return rc4_encrypt(data, key)

key = "harukaze"  # 密钥
data = b'\x9c\x83\x85V\xab\xa4\xf1"\xdeq\x8f\x85\x80&O\xb57lG\x02\xc6`>\x90'
print("原文:", data)
encrypted_data = rc4_encrypt(data, key)
print("加密后:", encrypted_data)
decrypted_data = rc4_decrypt(encrypted_data, key)
print("解密后:", decrypted_data)

由于我们得到的本身就是密文,根据对称密码RC4,密文加密得到的其实就是原文,
原文——b'\xc2{K\x0c\x17?\xf2p\x10\x1b2SO\xd9\xe3\xa8\xc4E\x01\xa6(\x0c\xa1\xb9'

import struct

def tea_encrypt(v, k):
    y, z = struct.unpack('<II', v)
    UINT32_MAX = 0xffffffff
    delta = 0x9e3779b9
    sum = 0
    n = 32

    w = [0] * 4
    for i in range(0, 4):
        w[i] = k[i]

    while n > 0:
        sum = (sum + delta) & UINT32_MAX
        y = (y + ((((z << 4) + w[0]) & UINT32_MAX) ^ ((z+sum) & UINT32_MAX) ^ (((z >> 5) + w[1]) & UINT32_MAX))) & UINT32_MAX
        z = (z + ((((y << 4) + w[2]) & UINT32_MAX) ^ ((y+sum) & UINT32_MAX) ^ (((y >> 5) + w[3]) & UINT32_MAX))) & UINT32_MAX
        n -= 1

    return struct.pack('<II', y, z)


def encrypt_string(s, key):
    # 将字符串转换为字节串
    s = s.encode('latin - 1')
    blocks = []
    k = 0
    for i in range(0, len(s), 8):
        block = s[i:i+8]
        if len(block) < 8:
            block = block + b'\0' * (8 - len(block))
        blocks.append(tea_encrypt(block, key))
    return b''.join(blocks)

def tea_decrypt(v, k):
    y, z = struct.unpack('<II', v)
    UINT32_MAX = 0xffffffff
    delta = 0x9e3779b9
    sum = (32 * delta) & UINT32_MAX
    n = 32

    w = [0] * 4
    for i in range(0, 4):
        w[i] = k[i]

    while n > 0:
        z = (z - ((((y << 4) + w[2]) & UINT32_MAX) ^ ((y+sum) & UINT32_MAX) ^ (((y >> 5) + w[3]) & UINT32_MAX))) & UINT32_MAX
        y = (y - ((((z << 4) + w[0]) & UINT32_MAX) ^ ((z+sum) & UINT32_MAX) ^ (((z >> 5) + w[1]) & UINT32_MAX))) & UINT32_MAX
        sum = (sum - delta) & UINT32_MAX
        n -= 1

    return struct.pack('<II', y, z)


def decrypt_string(s, key):
    blocks = []
    k = 0
    for i in range(0, len(s), 8):
        block = s[i:i+8]
        blocks.append(tea_decrypt(block, key))
    result = b''.join(blocks)
    return result.decode('latin - 1').rstrip('\0')

key = [0x12345678, 0x9ABCDEF0, 0x2468ACE0, 0xF13579B3]

test = b'\xc2{K\x0c\x17?\xf2p\x10\x1b2SO\xd9\xe3\xa8\xc4E\x01\xa6(\x0c\xa1\xb9'
print(decrypt_string(test, key))

使用工具

DIE
IDA
Vscode

工具链接: https://pan.baidu.com/s/1dzK8gcFjYEvnj_aA0UjBeQ?pwd=ry2d 提取码: ry2d

Flag

NSSCTF{Harukaze_l0ve_r3}

总结

通过本次题目学习到:
RC4算法
TEA算法

posted @ 2025-03-22 22:50  Binary-0  阅读(234)  评论(0)    收藏  举报