拿到exe先查壳。
发现UPX壳,软件脱壳。
脱完壳将32位exe拉进IDA。F5。
先进入sub_4110FF()函数查看。
这里是输入flag。
再去查看sub_411190函数
这里是将输入的Source与一个数组进行比较,配对成功就输出flag。
这个程序是输入一个flag。经过两个线程进行加密,再进行比较,若相同则成功。
所以重点是这两个线程。
进入第一个线程的StartAddress查看。发现关键函数sub_411940,进入,发现无法翻译成C语言。看网上说是堆栈不平衡,通过Options -> General ->Stack points 可以查看堆栈。
发现问题在这里,这里通过点击call指令,alt + k 来修改此处的堆栈。因为执行pop之后超出了栈底,所以这里我们将栈顶指针SP增加4个字节。故输入-0x04。
修改完重新F5,发现可以进去了。分析下这个函数,大概是将输入的flag逐个进行运算。再对上层函数的查看,大概是从第29个开始循环,从后到前对Flag进行加密。
进入第二个线程,发现没对flag操作,仅仅dword_418008-1
结合第一个进程和第二个进程。很多函数看不懂。操作系统很多还没学。
WaitForSingleObject和ReleaseMutex 大概就像排队进屋子里工作,第一个人进去,用钥匙把门锁上。工作完了就打开门,把锁和钥匙交给下一个人。
这里则是第一个线程先响应,进去工作,第二个线程等待。等第一个线程做完了,释放权限,第二个线程工作。第二个好了第一个又等待进入,如此循环往复。故第29个字符由线程1操作,第28个由线程2,第27个由线程1…
可以编写脚本了。
```python
a = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasd'
final = 'TOiZiZtOrYaToUwPnToBsOaOapsyS'
flag = ''
for i in range(len(final)):
if i%2 == 1: #单数
if (final[i].isupper()):
flag += chr(a.find(final[i]) + 96)
else:
flag += chr(a.find(final[i]) + 38)
else:
flag += final[i]
print(flag)
结果是ThisisthreadofwindowshahaIsES
发现错误。。flag有30位,而最后只对比了29位。看网上说再加1位,怎么加,不知道。。最后加了个E,提交成功。