d3Recover 复现

前言

属于是赛后看WP才发现自己忘记将数据恢复在ASCII范围内,导致一直出来的都是奇怪东西…

呜呜,送上门的分都没拿到

解题过程

题目给了两个程序,都是Python打包后的,其中V2版本没有去除掉符号表,V1去除掉了,通过观察V2相关东西,同样的可以找到一个Base64后的字符串,并可以直接进行解密

解密可以拿到But maybe I can help you recover the source code of d3recover_ver1.0.·,相当于提示我们可以使用BinDiff来恢复符号,我们将V2载入到V1,尝试恢复,可以大致拿到V1的符号表

随后我们寻找加密函数,我们可以观察到:

其置信度与V2版本较低,怀疑动了手脚,我们跟进去,进行分析,可以得到以下主要逻辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
for ( i = 0LL; i <= 31; ++i ){
Item = (_QWORD *)_Pyx_PyInt_From_long(i);
Item = (_QWORD *)_Pyx_PyObject_GetItem(a2, Item);
_Pyx_PyByteArray_Append(v9, v24 ^ 0x23u);
}
for ( j = 0LL; j <= 29; ++j ){
Item = (_QWORD *)_Pyx_PyInt_From_long(j);
v16 = (_QWORD *)_Pyx_PyInt_AddObjC(v10, qword_ABC1E8, 2LL, 0LL, 0LL);
v17 = (_QWORD *)_Pyx_PyObject_GetItem(v9, v16);
v16 = (_QWORD *)PyNumber_Add(Item, v17);
v17 = (_QWORD *)_Pyx_PyInt_AndObjC(v16, qword_ABC220, 255LL, 0LL, 0LL);
v16 = (_QWORD *)_Pyx_PyInt_XorObjC((__int64)v17, qword_ABC218, 0x54LL, 0);
PyObject_SetItem(v9, v10, v16)
}

我们可以拿到以上的内容,对其进行简单分析可以知道,其进行了以下运算

1
2
3
4
5
6
7
8
9
flag = "XXX"

for i in range(32):
flag[i] ^= 0x23
for i in range(30):
flag[i] += flag[i+2]
flag[i] ^= 0x54

Base64(flag)

我们直接拿到字符串中的Base64值:08fOyj+E27O2uYDq0M1y/Ngwldvi2JIIwcbF9AfsAl4=

将其解密后转换为数组进行解密即可

1
2
3
4
5
6
7
8
9
10
11
12
import base64
s='08fOyj+E27O2uYDq0M1y/Ngwldvi2JIIwcbF9AfsAl4='
s=base64.b64decode(s)

s=list(s)
for i in range(29,-1,-1):
s[i]^=0x54
s[i]=(s[i]-s[i+2])&0xff

for i in range(32):
s[i]^=0x23
print(bytes(s))

于是我们可以得到

1
b'flag{y0U_RE_Ma5t3r_0f_R3vocery!}'

d3Recover 复现
https://equinox-shame.github.io/2023/05/06/d3Recover 复现/
作者
梓曰
发布于
2023年5月6日
许可协议