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