随便扒拉来的题目

where_this_from.exe

刚拿到这题,直接给干重启

麻了

检查一下,需要输入两样东西

一个是user name

另一个是 key

而题中很多函数是无法识别的,内部由this函数组成

推测为ida对结构体的解析不全

先对整体函数进行简单分析一下

动调跑起来

Fail接了一个函数

具体为创建一个dat文件

写入能让你shutdown的指令

然后电脑就重启力,打个断点绕一绕

在ida里面看见了try 的注释,我一开始以为是seh,但是并没有看到对应的exception或者是finally块

老老实实看代码

上半部解析完成之后

发现整体的流程大概是

通过一系列变化生成中间string ,储存在v41,然后将nomoney转为数组存储在v39

对key进行一轮异或

最后对key和v36进行对比

v41和,nomoney都是可以直接用ida提取出来的

v36的值可以通过动调直接提取

1
[0x51, 0x3C, 0x0F, 0x67, 0x5C, 0x2C, 0x41, 0x53, 0x6A, 0x49, 0x70, 0x51, 0x68, 0x54, 0x2B, 0x23, 0x5B, 0x64, 0x0E, 0x60, 0x6A, 0x43, 0x69, 0x46, 0x69, 0x0C, 0x25, 0x41, 0x72, 0x44, 0x16, 0x72]

写脚本试试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#生成key的data
v41=[0x62, 0x39, 0x62, 0x37, 0x64, 0x64, 0x31, 0x63, 0x34, 0x32, 0x31, 0x65, 0x30, 0x30, 0x35,
0x62, 0x63, 0x39, 0x61, 0x37, 0x66, 0x37, 0x30, 0x62, 0x38, 0x34, 0x38, 0x65, 0x33, 0x64, 0x30, 0x65]
#循环赋值的loopstring,除模7
v39=[0x6e,0x6f,0x6d,0x6f,0x6e,0x65,0x79,0x6e,0x6f,0x6d,0x6f,0x6e,0x65,0x79,0x6e,0x6f,0x6d,0x6f,0x6e,0x65,0x79,0x6e,0x6f,0x6d,0x6f,0x6e,0x65,0x79,0x6e,0x6f,0x6d,0x6f]
#最终结果
v36_encode_data=[0x51, 0x3C, 0x0F, 0x67, 0x5C, 0x2C, 0x41, 0x53, 0x6A, 0x49, 0x70, 0x51, 0x68, 0x54, 0x2B, 0x23, 0x5B, 0x64, 0x0E, 0x60, 0x6A, 0x43, 0x69, 0x46, 0x69, 0x0C, 0x25, 0x41, 0x72, 0x44, 0x16, 0x72]
dword_41E378=0x2
flag=[]
for i in range(0,len(v36_encode_data)):
f=v39[-1-i]^v41[i]^v36_encode_data[-1-i]^dword_41E378
dword_41E378=v36_encode_data[-i-1]
flag.append(chr(f))
flag_str=''.join(flag)
flag_str=flag_str[::-1]
print(flag_str)

因为一开始是倒叙加密的

所以这里正着来的时候要对没有进行处理的数组顺序取反

保证异或顺序准确