sch9_ctf_3/tasks/Возвращение зашифрованного файла
2023-08-28 17:30:29 +00:00
..
Исходники Upload files to 'tasks/Возвращение зашифрованного файла/Исходники' 2023-06-17 12:38:15 +00:00
Файлы для таска Upload files to 'tasks/Возвращение зашифрованного файла/Файлы для таска' 2023-06-17 12:38:45 +00:00
README.md Update 'tasks/Возвращение зашифрованного файла/README.md' 2023-08-28 17:30:29 +00:00

Возвращение зашифрованного файла

Нас опять взломали и зашифровали все файлы. Нам удалось извлечь шифровальщик, но мы понятия не имеем, как расшифровать их. Поможете? Вот вам шифровальщик и пример зашифрованного файла, кстати.

Флаг: ctf{0h_c0ngr4tz_y0u_g0t_th1s!}

Решение:

Открываем файл в <ваш-любимый-дизассемблер-нейм> Видим в main() примерно следующий код (ghidra), который подозрительно похож на то, что мы видели в предыдущем таске:

undefined8 main(void)
{
  file = fopen("flag.txt","r");
  if (file == (FILE *)0x0) {
    puts("File does not exist!");
  }
  else {
    fgets(line,0x22,file);
    copying();
    encryption();
    puts(ans);
    fclose(file);
  }
  return 0;
}

Снова открывается файл flag.txt и из него читаются 0х22 символа. Функция copying() опять просто копирует одну строку в другую. Функция encryption() нас расстроит, но не сильно:

void encryption(void)
{
  int local_c;
  
  local_c = 0;
  while (local_c < 0x21) {
    local_c = local_c + 1;
    ans[local_c] = (char)local_c + ans[local_c] ^ 8;
  }
  return;
}

Здесь опять xor с той же константой, но помимо этого результат еще складывается с позицией символа в строке. Для декрипта важно не перепутать порядок этих действий: сначала xor-им, потом вычитаем.