Мы предложили участникам решить CTF-задание DropMeAgent с анализом «вредоносного» файла. Несмотря на отдельные комментарии, что задание было слишком простое, за отведенное время его решили всего два участника. У большинства возникли сложности и вопросы на разных этапах выполнения. Делимся решением.
💡 Задание:
Нужно проанализировать вредоносный файл Agent.exe. Для решения задания потребуется ноутбук и доступ к интернету.
Формат флага: ^flag\{[A-Za-z0-9_]+\}$
PS: файл получился действительно вредоносным! Настоятельно рекомендуем не запускать файл в основной системе — используйте виртуальную машину для решения.
Ссылка на файл: https://dropmefiles.com/cBPuk
Пароль от архива: 123
* ссылка доступна до 24.04.2026
✅ Решение:
0️⃣ Любым способом нужно определить, что файл
Agent.exe — это приложение .NET 9. Следовательно, потребуется декомпилятор (например, ILSpy). Также в описанном решении потребуется .NET 9 SDK и IDE для C#1️⃣ В результате анализа
Agent.exe должны получиться следующие данные:— В классе
Params в переменной Message содержится зашифрованная конфигурация файла.— Метод
RunAssembly загружает с dropmefiles.com зашифрованные сборки .NET и запускает их.— Расшифровка конфигурации и сборок выполняется с помощью метода
Dec.— Метод
GetParams расшифровывает и парсит конфигурацию2️⃣ Чтобы облегчить решение, создаем свой проект на C# и переносим в него класс
Params и методы Dec и GetParams. С помощью расшифровки Message получаем конфигурацию:Encoding.UTF8.GetString(Dec(Params.Message))
{
"c": "https://dropmefiles.com/",
"i": 2,
"p":
[
{ "PxyG8": "1" },
{ "ExwwU": "1" },
{ "KRhvk": "3" }
]
}Так получаем три ссылки на сборки
.NET с ресурса dropmefiles.com3️⃣ Поочередно расшифровываем все обнаруженные нагрузки
var decrypted_dll = Dec(File.ReadAllBytes("payload1"));
File.WriteAllBytes("payload1.dll", decrypted_dll);4️⃣ В результате декомпиляции
payload1 получаем код:public class EntryPoint
{
private static string SECRET = "srm3sKOuv+q/srO6v5XSvNCXh56btoeCmIyesMLBwMWJ";
public static void Run()
{
Console.WriteLine(Decrypt(SECRET));
}
private static string Decrypt(string cipherText)
{
byte[] array = Convert.FromBase64String(cipherText);
for (int i = 0; i < array.Length; i++)
{
array[i] ^= (byte)(212 + i);
}
return Encoding.UTF8.GetString(array);
}
}
5️⃣ Запускаем код из
payload1 и сдаем флаг организаторам.Надеемся, что вы не попались на рик-ролл и не потратили много времени на поиск флага в файле
flag.mp4.
Ну что, насколько сложным был таск?🤓 — слишком просто
😨 — слишком сложно
🔥 — всё понравилось
