Киберколизей CODEBY 04-2024. Writeup Reverse Stranger
балобашСкачиваем архив с сайта, распаковываем и обнаруживаем task.exe в заблокированных угрозах сразу с двумя видами троянов: Trojan:Win32/Znyonm и Trojan:Script/Wacatac.B!ml. Удаляем винду отключаем антивирус и идем разбирать приложение.
Первым делом попытаемся запустить файл. Состоятельных людей (с лицензией IDA) сразу же встретит приветливое окно с ящерскими глифами, по закрытии которого приложение успешно закончит работу. Людям с Ghidra повезет несколько меньше, и они увидят ровным счетом ничего. Но грустить рано, запускаем диссасемблер и начинаем разбираться, что вообще происходит.

Тут же нас встречает изобилие непонятных функций. Есть несколько вариантов для дальнейших действий: прогнать .exe файл на строчки и попытаться отыскать что-то интересное, начать судорожно метаться по code browser'у в надежде обрести понимание происходящего, пойти дебаггать приложение. Я попробовал все три варианта, и поэтому рекомендую пойти первым путем.
Среди подозрительных строчек замечаем следующие: "ida.exe", "ida64.exe", "notepad.exe". Попытаемся найти в каких функциях они фигурируют. Поиск по памяти программы быстро приводит нас к единственной функции по адресу FUN_00401550, частично декомпилированный код которой выглядит следующим образом:

Ага, вот и первая зацепка к тому, почему антивирус заблокировал программу: task.exe делает snapshot рабочих процессов и, перебирая их один за другим, убеждается в отсутствии среди них IDA. Здесь же замечаем еще один подозрительный момент: task.exe охотится за notepad.exe (помянем добряка).

При наличии запущенного процесса notepad.exe, приложение запрашивает выделить память под сомнительные данные, пытается их записать, а потом исполняет. Также предварительно эти данные проходят обработку. Давайте взглянем на то, что же пытается записать task.exe.

Вот так выглядят данные по адресу DAT_00404020:

Приведем их к нужному виду (вычтем их каждого байта 30h) и попробуем дизассемблировать:

Пройдемся по строчкам и изучим, что же делает этот алгоритм:
1) Кладет в регистр RBX адрес 0x40404e.

2) Задает RCX = 0;

3) Задает RDI = 47;

4) Запускает цикл for от RCX = 0 до RDI = 47, в котором из байтов строки s (лежит в RBX) вычитается 0x80.

Что же такое строка s, лежащая по адресу 0x40404e? Это байты, идущие сразу же за снипетом ассемблера. Осталось написать короткий скрипт на Python, который проделает махинации выше со строкой s.

Запускаем, и... Флаг получен. 😎
как удалить это поле...