春秋杯秋赛

⏳:2021-11-27

Snake

查壳 发现upx壳

代码脱壳无果 之后手脱 ida32打开

shift+f12查找相关字符串

 

找到base64表和加密数据

先用base64解码发现没那么简单

之后查找密文引用处 做一个简单的分析

 

为什么确定是变码base64

理由:查找引用 sub_40186F 函数的函数中 找到开头函数 进入查看

(这里的变码函数是从 main 函数起始开始一步步查找找到的)

 

函数内部逻辑:

 

找一个在线C编译或者自己复制代码查看 得出结果

ABCDEFGHIJKLMNOPQRST0123456789+/UVWXYZabcdefghijklmnopqrstuvwxyz

退回查看异或操作具体内容 逻辑比较简单

 

写出脚本求解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import base64
import string

table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" #base64初始加密表

model = "ABCDEFGHIJKLMNOPQRST0123456789+/UVWXYZabcdefghijklmnopqrstuvwxyz" #魔改之后的表

flag = "7G5d5bAy+TMdLWlu5CdkMTlcJnwkNUgb2AQL3CcmPpVf6DAp72scOSlb" #密文 要解密的字符串

STR = list(base64.b64decode(flag.translate(str.maketrans(model,table)))) #maketrans作用 将model中要替换的字符转换为table对应的字符(同一位置)
#list作用 将数据转换成列表 即数组

for i in range(1,11,1):
for j in range(len(STR)):
if(len(STR) % i):
STR[j] ^= (j + i)
else:
STR[j] ^= ((j % i) + j)

for i in range(len(STR)):
print(chr(STR[i]),end='')

flag{5e2200bc-f21a-5421-a90b-57dec19fe196}