Writeup Чувак, где мой флаг? [Writeup]

M4x

Green Team
20.05.2024
22
46
Без лишних предисловий перейдем к делу.

Имеем на руках подозрительный файл с названием, записанным задом наперед — типичный прием, любимый разработчиками вредоносов. На самом деле его настоящее имя: x<202e>gpj.exe (там Unicode-символ U+202E — Right-to-Left Override, чтобы обмануть глаз).

Первым делом скармливаем файл binwalk’у с опцией автоматической экстракции всего, что найдёт:

Bash:
binwalk --dd='.*' x<202e>gpj.exe

В результате получаем 15 файлов. Среди них — отвлекающие приманки вроде фото котика, но нас интересует файл 72E00. Проверяем тип:

Bash:
file 72E00

— и видим, что это RAR-архив. Распаковываем:

Bash:
unrar x 72E00

В результате распаковки мы получили три файла:
  • flag.jpg,
  • chuvak.wav,
  • prg.exe.
Изучение первых двух файлов ни к чему меня не привело, поэтому я сосредоточился на экзешнике. Так как Windows под рукой не оказалось, пришлось реверсить. В заданиях по форензике нередко сталкиваешься с реверс-инжинирингом: приходится дизассемблировать, чтобы понять, что делает бинарник. Это нормально — развивает навык анализа исполняемых файлов.

(Позже я узнал, что задачку можно было решить проще — через Process Monitor: при запуске prg.exe он создает файл flag.txt в C:\Users\Public. Но как я уже говорил, я решал путем реверса.)

Открываем prg.exe в Ghidra и почти сразу натыкаемся на следующий участок кода:

Код:
  __main();
  local_48 = 2;
  local_47 = 0xe;
  local_46 = 5;
  local_45 = 4;
  local_44 = 3;
  local_43 = 0x18;
  local_42 = 0x3a;
  local_41 = 2;
  local_40 = 0x29;
  local_3f = 0x34;
  local_3e = 0x17;
  local_3d = 1;
  local_3c = 0x2a;
  local_3b = 0x1e;
  local_3a = 0x27;
  local_39 = 0x2d;
  local_38 = 1;
  local_37 = 0x26;
  local_36 = 0x1e;
  local_35 = 1;
  local_34 = 0x2f;
  local_33 = 0x25;
  local_32 = 0x1e;
  local_31 = 0x35;
  local_30 = 0x20;
  local_2f = 0x12;
  local_2e = 0x2a;
  local_2d = 0x3c;
  local_10 = 0x1c;
  local_11 = 0x41;
  xorEncrypt((longlong)&local_48,0x1c,0x41);
  local_20 = fopen("C:\\Users\\Public\\flag.txt","wb");
  if (local_20 != (FILE *)0x0) {
    fwrite(&local_48,1,(longlong)local_10,local_20);
    fclose(local_20);
  }

Что здесь происходит:
  • Инициализируется массив из 28 байт (0x1c), начиная с local_48.
  • Вызывается функция xorEncrypt, которая применяет XOR с ключом 0x41 ко всем элементам этого массива.
  • Результат записывается в flag.txt.
Забираем массив байтов и кидаем в CyberChef. Операция — XOR (ключ 41 в hex). Получаем флаг.

task.webp
 
Последнее редактирование:
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab