diff --git a/tasks/Зашифрованный файл/README.md b/tasks/Зашифрованный файл/README.md new file mode 100644 index 0000000..8cca1c1 --- /dev/null +++ b/tasks/Зашифрованный файл/README.md @@ -0,0 +1,53 @@ +Условие (можете поменять если придумаете что-то эпичнее): + +Нас взломали и зашифровали все файлы. Нам удалось извлечь шифровальщик, но мы понятия не имеем, как расшифровать их. Поможете? Вот вам шифровальщик и пример зашифрованного файла, кстати. + +Флаг: ```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 для получения ответа. \ No newline at end of file