👤 Author: Benjamin Taylor (@benjqminn)
🛡️ Team: Sherlock’s Homies
🏆 Ranking: 634 / 7,085 teams
📝 Prompt: With the malware extracted, Holmes inspects its logic. The strain spreads silently across the entire network. Its goal? Not destruction-but something more persistent…friends. NOTE: The downloaded file is active malware. Take the necessary precautions when attempting this challenge.
📌 Summary: A malware sample has been extracted for analysis — it spreads quietly across a network with the unusual goal of persistence rather than outright destruction. Your task is to reverse-engineer its behavior (DLL imports, GUIDs, COM interop, opcodes, and decryption/key-generation logic), recover and decrypt the killswitch domain, and then block that domain in a controlled Docker environment to claim the final artifact.
⚠️ DISCLAIMER: This walkthrough was all completed inside of a Virtual Machine, as we are dealing with malware. Proceed with caution.
🟥 Challenge Difficulty: HARD
ole32.dlldabcd999-1234-4567-89ab-1234567890ffInteropff 50 687, 42hff 50 58getaddrinfoNetShareEnumff 50 60HTB{Eternal_Companions_Reunited_Again}Question: During execution, the malware initializes the COM library on its main thread. Based on the imported functions, which DLL is responsible for providing this functionality? (filename.ext)
Walkthrough:
The_Payload.zip file, upon extracting it, there are 3 files: AetherDesk-v74-77.exe, AetherDesk-v74-77.pdb, and DANGER.txt.
DANGER.txt file, we are left a message (as the player) warning of the danger the artifacts for this challenge entail.
AetherDesk-v74-77.exe file, we can check the Import Directory to find the DLL.
ole32.dll is utilized.Answer: ole32.dll
Question: Which GUID is used by the binary to instantiate the object containing the data and code for execution? (**----****)
Walkthrough:

AetherDesk-v74-77.exe file, upon scrolling to the decompiled view of the main function, we can find the GUID used to instantiate.
Answer: dabcd999-1234-4567-89ab-1234567890ff
Question: Which .NET framework feature is the attacker using to bridge calls between a managed .NET class and an unmanaged native binary? (string)
Walkthrough:
CoCreateInstance, OleRun, and QueryLibrary.


Answer: Interop
Question: Which Opcode in the disassembly is responsible for calling the first function from the managed code? (** ** **)
Walkthrough:
AetherDesk-v74-77.exe file, we can see that the call to .NET happened in a line with the following: (**(code **) (*local_208 + 0x68))(local_208,&local_210);.
ff 50 68.Answer: ff 50 68
Question: Identify the multiplication and addition constants used by the binary’s key generation algorithm for decryption. (*, **h)
Walkthrough:
(*, **h) format, with “h” meaning hexadecimal.
local_1f8._Buf[(longlong)pIVar12] = (char)pIVar12 * '\a' + 'B';, we can see that \a and B are used as the constraints for the binary’s key generation algorithm.
\a -> 0x7 and B -> 0x42, we just have to format our response for the flag.Answer: 7, 42h
Question: Which Opcode in the disassembly is responsible for calling the decryption logic from the managed code? (** ** **)
Walkthrough:

Answer: ff 50 58
Question: Which Win32 API is being utilized by the binary to resolve the killswitch domain name? (string)
Walkthrough:

IUnknown entries, then stores a BSTR pointer into the spot for a vtable pointer.WSAStratup, WSACleanup, and getaddrinfo.getaddrinfo is used for DNS resolution, and the decoded string is supplied to this getaddrinfo (which is an API from Win32).Answer: getaddrinfo
Question: Which network-related API does the binary use to gather details about each shared resource on a server? (string)
Walkthrough:
ScanAndSpread().
NetShareEnum that grabs information about each shared resource on the server.
Netapi32.dll library.
Answer: NetShareEnum
Question: Which Opcode is responsible for running the encrypted payload? (** ** **)
Walkthrough:
ScanAndSpread() function from the prior question, we can see that there is an encrypted blob present.
Answer: ff 50 60
Question: Find → Block → Flag: Identify the killswitch domain, spawn the Docker to block it, and claim the flag. (HTB{**_**_**_**})
Walkthrough:
KXgmYHMADxsV8uHiuPPB3w==local_1f8._Buf[(longlong)pIVar12] = (char)pIVar12 * '\a' + 'B';(i*7 + ord('B')) & 0xff) to print as a single hex string.
The Python code I used to decode the string is:
key_array = []
for i in range(32):
  key_array.append(format((i * 7 + ord('B')) & 0xff, '02x'))
print(''.join(key_array))
424950575e656c737a81888f969da4abb2b9c0c7ced5dce3eaf1f8ff060d141b.
k1v7-echosim.net.


Answer: HTB{Eternal_Companions_Reunited_Again}
Back to Main Page: Holmes CTF 2025