前言
属于是赛后看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!}'
|