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