sch9_ctf_3/tasks/Зашифрованный файл
2023-06-17 12:33:51 +00:00
..
README.md Upload files to 'tasks/Зашифрованный файл' 2023-06-17 12:33:51 +00:00

Условие (можете поменять если придумаете что-то эпичнее):

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

Флаг: ctf{th1s_x0r_1s_s1mpl3}

Решение:

  1. Наивное. Переименовываем файл из flag.enc в flag.txt. Запускаем. Успех. Проблемы решения: штука скомпилирована под Линукс =)

  2. Нормальное. Открываем файл в <ваш-любимый-дизассемблер-нейм> Видим в 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();
    orexclusive();
    puts(ans);
    fclose(file);
  }
  return 0;
}

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

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

Она осуществляет xor каждого второго элемента строки с константой. Так как мы знаем, что xor - самообратимый, коммутативный и вообще классный, нам нужно просто проксорить каждый второй элемент строки с 8 для получения ответа.