关键代码

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

传入的&s和&dword_8048A90的形参分别为:s和a2
&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}