攻防世界 |

关键代码

image

可以看到我们需要的密钥就是S2
S2的值通过&s&dword_8048A90传入decrypt()函数计算得出
查看函数的代码如下:

image

传入的&s&dword_8048A90的形参分别为:sa2

&s的数据

rodata:08048AA8 ; const wchar_t s
.rodata:08048AA8 s               dd 143Ah                ; DATA XREF: authenticate+11↑o
.rodata:08048AAC                 db  36h ; 6
.rodata:08048AAD                 db  14h
.rodata:08048AAE                 db    0
.rodata:08048AAF                 db    0
.rodata:08048AB0                 db  37h ; 7
.rodata:08048AB1                 db  14h
.rodata:08048AB2                 db    0
.rodata:08048AB3                 db    0
.rodata:08048AB4                 db  3Bh ; ;
.rodata:08048AB5                 db  14h
.rodata:08048AB6                 db    0
.rodata:08048AB7                 db    0
.rodata:08048AB8                 db  80h
.rodata:08048AB9                 db  14h
.rodata:08048ABA                 db    0
.rodata:08048ABB                 db    0
.rodata:08048ABC                 db  7Ah ; z
.rodata:08048ABD                 db  14h
.rodata:08048ABE                 db    0
.rodata:08048ABF                 db    0
.rodata:08048AC0                 db  71h ; q
.rodata:08048AC1                 db  14h
.rodata:08048AC2                 db    0
.rodata:08048AC3                 db    0
.rodata:08048AC4                 db  78h ; x
.rodata:08048AC5                 db  14h
.rodata:08048AC6                 db    0
.rodata:08048AC7                 db    0
.rodata:08048AC8                 db  63h ; c
.rodata:08048AC9                 db  14h
.rodata:08048ACA                 db    0
.rodata:08048ACB                 db    0
.rodata:08048ACC                 db  66h ; f
.rodata:08048ACD                 db  14h
.rodata:08048ACE                 db    0
.rodata:08048ACF                 db    0
.rodata:08048AD0                 db  73h ; s
.rodata:08048AD1                 db  14h
.rodata:08048AD2                 db    0
.rodata:08048AD3                 db    0
.rodata:08048AD4                 db  67h ; g
.rodata:08048AD5                 db  14h
.rodata:08048AD6                 db    0
.rodata:08048AD7                 db    0
.rodata:08048AD8                 db  62h ; b
.rodata:08048AD9                 db  14h
.rodata:08048ADA                 db    0
.rodata:08048ADB                 db    0
.rodata:08048ADC                 db  65h ; e
.rodata:08048ADD                 db  14h
.rodata:08048ADE                 db    0
.rodata:08048ADF                 db    0
.rodata:08048AE0                 db  73h ; s
.rodata:08048AE1                 db  14h
.rodata:08048AE2                 db    0
.rodata:08048AE3                 db    0
.rodata:08048AE4                 db  60h ; `
.rodata:08048AE5                 db  14h
.rodata:08048AE6                 db    0
.rodata:08048AE7                 db    0
.rodata:08048AE8                 db  6Bh ; k
.rodata:08048AE9                 db  14h
.rodata:08048AEA                 db    0
.rodata:08048AEB                 db    0
.rodata:08048AEC                 db  71h ; q
.rodata:08048AED                 db  14h
.rodata:08048AEE                 db    0
.rodata:08048AEF                 db    0
.rodata:08048AF0                 db  78h ; x
.rodata:08048AF1                 db  14h
.rodata:08048AF2                 db    0
.rodata:08048AF3                 db    0
.rodata:08048AF4                 db  6Ah ; j
.rodata:08048AF5                 db  14h
.rodata:08048AF6                 db    0
.rodata:08048AF7                 db    0
.rodata:08048AF8                 db  73h ; s
.rodata:08048AF9                 db  14h
.rodata:08048AFA                 db    0
.rodata:08048AFB                 db    0
.rodata:08048AFC                 db  70h ; p
.rodata:08048AFD                 db  14h
.rodata:08048AFE                 db    0
.rodata:08048AFF                 db    0
.rodata:08048B00                 db  64h ; d
.rodata:08048B01                 db  14h
.rodata:08048B02                 db    0
.rodata:08048B03                 db    0
.rodata:08048B04                 db  78h ; x
.rodata:08048B05                 db  14h
.rodata:08048B06                 db    0
.rodata:08048B07                 db    0
.rodata:08048B08                 db  6Eh ; n
.rodata:08048B09                 db  14h
.rodata:08048B0A                 db    0
.rodata:08048B0B                 db    0
.rodata:08048B0C                 db  70h ; p
.rodata:08048B0D                 db  14h
.rodata:08048B0E                 db    0
.rodata:08048B0F                 db    0
.rodata:08048B10                 db  70h ; p
.rodata:08048B11                 db  14h
.rodata:08048B12                 db    0
.rodata:08048B13                 db    0
.rodata:08048B14                 db  64h ; d
.rodata:08048B15                 db  14h
.rodata:08048B16                 db    0
.rodata:08048B17                 db    0
.rodata:08048B18                 db  70h ; p
.rodata:08048B19                 db  14h
.rodata:08048B1A                 db    0
.rodata:08048B1B                 db    0
.rodata:08048B1C                 db  64h ; d
.rodata:08048B1D                 db  14h
.rodata:08048B1E                 db    0
.rodata:08048B1F                 db    0
.rodata:08048B20                 db  6Eh ; n
.rodata:08048B21                 db  14h
.rodata:08048B22                 db    0
.rodata:08048B23                 db    0
.rodata:08048B24                 db  7Bh ; {
.rodata:08048B25                 db  14h
.rodata:08048B26                 db    0
.rodata:08048B27                 db    0
.rodata:08048B28                 db  76h ; v
.rodata:08048B29                 db  14h
.rodata:08048B2A                 db    0
.rodata:08048B2B                 db    0
.rodata:08048B2C                 db  78h ; x
.rodata:08048B2D                 db  14h
.rodata:08048B2E                 db    0
.rodata:08048B2F                 db    0
.rodata:08048B30                 db  6Ah ; j
.rodata:08048B31                 db  14h
.rodata:08048B32                 db    0
.rodata:08048B33                 db    0
.rodata:08048B34                 db  73h ; s
.rodata:08048B35                 db  14h
.rodata:08048B36                 db    0
.rodata:08048B37                 db    0
.rodata:08048B38                 db  7Bh ; {
.rodata:08048B39                 db  14h
.rodata:08048B3A                 db    0
.rodata:08048B3B                 db    0
.rodata:08048B3C                 db  80h
.rodata:08048B3D                 db  14h
.rodata:08048B3E                 db    0
.rodata:08048B3F                 db    0
.rodata:08048B40                 db    0
.rodata:08048B41                 db    0
.rodata:08048B42                 db    0
.rodata:08048B43                 db    0
所以
s = [':', '6', '7', ';',
     '\x80', 'z', 'q',
     'x', 'c', 'f', 's',
     'g', 'b', 'e', 's',
     '`', 'k', 'q', 'x',
     'j', 's', 'p', 'd',
     'x', 'n', 'p', 'p',
     'd', 'p', 'd', 'n',
     '{', 'v', 'x', 'j', 's', '{', '\x80']

&dword_8048A90的数据

.rodata:08048A90 dword_8048A90   dd 1401h                ; DATA XREF: authenticate+9↑o
.rodata:08048A94                 db    2
.rodata:08048A95                 db  14h
.rodata:08048A96                 db    0
.rodata:08048A97                 db    0
.rodata:08048A98                 db    3
.rodata:08048A99                 db  14h
.rodata:08048A9A                 db    0
.rodata:08048A9B                 db    0
.rodata:08048A9C                 db    4
.rodata:08048A9D                 db  14h
.rodata:08048A9E                 db    0
.rodata:08048A9F                 db    0
.rodata:08048AA0                 db    5
.rodata:08048AA1                 db  14h
.rodata:08048AA2                 db    0
.rodata:08048AA3                 db    0
.rodata:08048AA4                 db    0
.rodata:08048AA5                 db    0
.rodata:08048AA6                 db    0
.rodata:08048AA7                 db    0
所以
a2 = [1, 2, 3, 4, 5]
根据decrypt()函数中的逻辑,编写逆向解密脚本
逆向解密脚本
# 1. 定义原始密文字符数组s(对应C中的wchar_t* s)
s = [':', '6', '7', ';',
     '\x80', 'z', 'q',
     'x', 'c', 'f', 's',
     'g', 'b', 'e', 's',
     '`', 'k', 'q', 'x',
     'j', 's', 'p', 'd',
     'x', 'n', 'p', 'p',
     'd', 'p', 'd', 'n',
     '{', 'v', 'x', 'j', 's', '{', '\x80']

# 2. 定义密钥数组a2(对应C中的wchar_t* a2)
a2 = [1, 2, 3, 4, 5]


# 3. 核心解密逻辑(复刻C函数)
def decrypt(s_list, a2_list):
    # 复制密文字符列表,避免修改原数据(对应C中的wcscpy(dest, s))
    dest = s_list.copy()
    # 密文长度(对应v6)
    s_len = len(dest)
    # 密钥长度(对应v7)
    a2_len = len(a2_list)
    # v4初始化为0(C代码未初始化,业务逻辑默认0)
    v4 = 0

    # 复刻C中的while+for循环逻辑
    while v4 < s_len:
        i = 0
        # 循环遍历密钥,直到用完密钥或密文
        while i < a2_len and v4 < a2_len:
       # for i in range(a2_len):
        #    if v4 >= s_len:
                #break

            # 核心操作:字符的Unicode码点减去a2[i]
            # ord()获取字符码点,chr()转回字符
            dest[v4] = chr(ord(dest[v4]) - a2_list[i])
            i += 1
            v4 += 1
    # 拼接为最终字符串
    return ''.join(dest)

# 4. 执行解密并输出结果
correct_dest = decrypt(s, a2)
print("解密后的正确dest(密码):")
print(correct_dest)
FLAG:9447{you_are_an_international_mystery}
posted @ 2026-01-31 14:06  Dragon_Roar  阅读(1)  评论(0)    收藏  举报