【BUUCTF】Youngter-drive

结城希亚發表於2024-10-28

Youngter-drive

UPX脫殼

分析

image-20241028214938347

這是一道多執行緒題,先來分析這個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_41119FStartAddress的區別就是第一個呼叫了sub_41112C函式對字串進行了加密

image-20241028231153385

這就是主加密程式

簡單的字母替換程式

編寫指令碼

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