normal17

有个upx壳

upx -d 脱壳

进入start函数

此处的CreateMutexW为创建新的互斥体,全局变量 ::hObject获取互斥对象返回的句柄以便调用

此处创建互斥对象的作用就在于防止下面的双线程引起资源冲突,防止数据损坏。

CreateMutexA 函数 (synchapi.h) - Win32 apps |微软文档 (microsoft.com)

进入startaddress

加密方式不繁琐,小写给替换成string中的大写,大写反之。

从第29位开始。这玩意循环30次,但是密码长度只有29,应该是要加东西。

关键在于两个线程的WaitForSingleObject这个函数

WaitForSingleObject function (synchapi.h) - Win32 apps |微软文档 (microsoft.com)

startsaddre是最先开启的线程,而WaitForSingleObject则会让他在sleep 的时候挂起,使其进入等待状态,而ReleaseMutex空出使用权限给其他线程。

从而执行第二个线程的指针递减,等第二个线程sleep了又会空出使用权限,互斥体权限交给第一个线程执行加密

也就是奇数加密偶数不加密

写个脚本

1
2
3
4
5
6
7
8
9
10
11
12
data='TOiZiZtOrYaToUwPnToBsOaOapsyS'
string='QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm'
flag=[]
for i in range(len(data)):
if i%2==0:
flag+=data[i]
else:
if ord(data[i])>=97 and ord(data[i])<=122:
flag+=chr(string.find(data[i])+38)
else:
flag+=chr(string.find(data[i])+96)
print(flag)