diff --git a/tasks/Возвращение зашифрованного файла/README.md b/tasks/Возвращение зашифрованного файла/README.md new file mode 100644 index 0000000..5db9f36 --- /dev/null +++ b/tasks/Возвращение зашифрованного файла/README.md @@ -0,0 +1,47 @@ +Условие (можете поменять если придумаете что-то эпичнее): + +Нас опять взломали и зашифровали все файлы. Нам удалось извлечь шифровальщик, но мы понятия не имеем, как расшифровать их. Поможете? Вот вам шифровальщик и пример зашифрованного файла, кстати. + +Флаг: ```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-им, потом вычитаем. \ No newline at end of file diff --git a/tasks/Возвращение зашифрованного файла/Исходники/decrypt b/tasks/Возвращение зашифрованного файла/Исходники/decrypt new file mode 100644 index 0000000..a1755aa Binary files /dev/null and b/tasks/Возвращение зашифрованного файла/Исходники/decrypt differ diff --git a/tasks/Возвращение зашифрованного файла/Исходники/decrypt_file.cpp b/tasks/Возвращение зашифрованного файла/Исходники/decrypt_file.cpp new file mode 100644 index 0000000..34653c4 --- /dev/null +++ b/tasks/Возвращение зашифрованного файла/Исходники/decrypt_file.cpp @@ -0,0 +1,32 @@ +#include +#include + +const int maxsize = 33; +char line[maxsize+1]; +char ans[maxsize+1]; +FILE * file; + +void copying() { + for (int i = 0; i < maxsize; ++i) { + ans[i] = line[i]; + } +} + +void decryption() { + for (int i = 0; i < maxsize; i+=1, ans[i] = (ans[i] ^ '^'-'|'+'&') - i) { + } +} + +int main(int argc, char * argv[]) { + file = fopen("flag.enc", "r"); + if (file == NULL) + printf("File does not exist!\n"); + else { + fgets(line, maxsize+1, file); + copying(); + decryption(); + printf("%s\n", ans); + fclose(file); + } + return 0; +} diff --git a/tasks/Возвращение зашифрованного файла/Исходники/encrypt_file.cpp b/tasks/Возвращение зашифрованного файла/Исходники/encrypt_file.cpp new file mode 100644 index 0000000..c80b07f --- /dev/null +++ b/tasks/Возвращение зашифрованного файла/Исходники/encrypt_file.cpp @@ -0,0 +1,32 @@ +#include +#include + +const int maxsize = 33; +char line[maxsize+1]; +char ans[maxsize+1]; +FILE * file; + +void copying() { + for (int i = 0; i < maxsize; ++i) { + ans[i] = line[i]; + } +} + +void encryption() { + for (int i = 0; i < maxsize; i+=1, ans[i] = (ans[i] + i) ^ '^'-'|'+'&') { + } +} + +int main(int argc, char * argv[]) { + file = fopen("flag.txt", "r"); + if (file == NULL) + printf("File does not exist!\n"); + else { + fgets(line, maxsize+1, file); + copying(); + encryption(); + printf("%s\n", ans); + fclose(file); + } + return 0; +} diff --git a/tasks/Возвращение зашифрованного файла/Исходники/flag.txt b/tasks/Возвращение зашифрованного файла/Исходники/flag.txt new file mode 100644 index 0000000..0b6ea6d --- /dev/null +++ b/tasks/Возвращение зашифрованного файла/Исходники/flag.txt @@ -0,0 +1,2 @@ +ctf{0h_c0ngr4tz_y0u_g0t_th1s!} + diff --git a/tasks/Возвращение зашифрованного файла/Файлы для таска/cryptor2 b/tasks/Возвращение зашифрованного файла/Файлы для таска/cryptor2 new file mode 100644 index 0000000..7ac8e8e Binary files /dev/null and b/tasks/Возвращение зашифрованного файла/Файлы для таска/cryptor2 differ diff --git a/tasks/Возвращение зашифрованного файла/Файлы для таска/flag.enc b/tasks/Возвращение зашифрованного файла/Файлы для таска/flag.enc new file mode 100644 index 0000000..aa0dbcc --- /dev/null +++ b/tasks/Возвращение зашифрованного файла/Файлы для таска/flag.enc @@ -0,0 +1 @@ +c}`v +Видим в 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 diff --git a/tasks/Зашифрованный файл/Исходники/encrypt_file.cpp b/tasks/Зашифрованный файл/Исходники/encrypt_file.cpp new file mode 100644 index 0000000..402bd81 --- /dev/null +++ b/tasks/Зашифрованный файл/Исходники/encrypt_file.cpp @@ -0,0 +1,31 @@ +#include +#include + +const int maxsize = 33; +char line[maxsize+1]; +char ans[maxsize+1]; +FILE * file; + +void copying() { + for (int i = 0; i < maxsize; ++i) { + ans[i] = line[i]; + } +} + +void orexclusive() { + for (int i = 0; i < maxsize; i+=2, ans[i]^='^'-'|'+'&') {} +} + +int main(int argc, char * argv[]) { + file = fopen("flag.txt", "r"); + if (file == NULL) + printf("File does not exist!\n"); + else { + fgets(line, maxsize+1, file); + copying(); + orexclusive(); + printf("%s\n", ans); + fclose(file); + } + return 0; +} diff --git a/tasks/Зашифрованный файл/Исходники/flag.txt b/tasks/Зашифрованный файл/Исходники/flag.txt new file mode 100644 index 0000000..178771d --- /dev/null +++ b/tasks/Зашифрованный файл/Исходники/flag.txt @@ -0,0 +1 @@ +ctf{th1s_x0r_1s_s1mpl3} diff --git a/tasks/Зашифрованный файл/Файлы для таска/cryptor b/tasks/Зашифрованный файл/Файлы для таска/cryptor new file mode 100644 index 0000000..60b5bcd Binary files /dev/null and b/tasks/Зашифрованный файл/Файлы для таска/cryptor differ diff --git a/tasks/Зашифрованный файл/Файлы для таска/flag.enc b/tasks/Зашифрованный файл/Файлы для таска/flag.enc new file mode 100644 index 0000000..4db26fc --- /dev/null +++ b/tasks/Зашифрованный файл/Файлы для таска/flag.enc @@ -0,0 +1,2 @@ +ctn{|h9sWx8rW1{_{1epd3u +