sch9_ctf_3/tasks/Зашифрованный файл/README.md

55 lines
2.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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