Условие (можете поменять если придумаете что-то эпичнее): Нас взломали и зашифровали все файлы. Нам удалось извлечь шифровальщик, но мы понятия не имеем, как расшифровать их. Поможете? Вот вам шифровальщик и пример зашифрованного файла, кстати. Флаг: ```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 для получения ответа.