Youngter-drive
UPX脱壳
分析
这是一道多线程题,先来分析这个main函数
::hObject = CreateMutexW(0, 0, 0);
: 创建一个互斥锁,使两个双线程能够使用共享资源
hObject = CreateThread(0, 0, StartAddress, 0, 0, 0); Thread = CreateThread(0, 0, sub_41119F, 0, 0, 0);
:创建两个线程
while ( dword_418008 != -1 )
: 一直循环到dword_418008
为-1结束程序
分析双线程程序
跟进StartAddress
void __stdcall __noreturn StartAddress_0(int a1)
{
while ( 1 )
{
WaitForSingleObject(hObject, 0xFFFFFFFF);
if ( dword_418008 > -1 )
{
sub_41112C(&Source, dword_418008);
--dword_418008;
Sleep(0x64u);
}
ReleaseMutex(hObject);
}
}
Sleep(0x64u);
:先第一个程序运行后,sleep,然后马上运行第二个进程,然后sleep,又运行第一个,循环
sub_41119F
和StartAddress
的区别就是第一个调用了sub_41112C
函数对字符串进行了加密
这就是主加密程序
简单的字母替换程序
编写脚本
key = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm'
enc = 'TOiZiZtOrYaToUwPnToBsOaOapsyS'
flag = ''
for i in range(29):
if i % 2 == 0:
flag += enc[i]
else:
if ord(enc[i]) <= ord('Z'):
flag += chr(key.index(enc[i]) + 96)
else:
flag += chr(key.index(enc[i]) + 38)
print(flag)
ThisisthreadofwindowshahaIsES
但这个flag不完整,最后一位也不知道咋搞,只能爆破了
最后flag:ThisisthreadofwindowshahaIsESE