sch9_ctf_3/tasks/Возвращение зашифрованного файла/README.md

47 lines
1.8 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{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-им, потом вычитаем.