silmaulviel reverse tasks upload #1
1 changed files with 47 additions and 0 deletions
47
tasks/Возвращение зашифрованного файла/README.md
Normal file
47
tasks/Возвращение зашифрованного файла/README.md
Normal file
|
@ -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-им, потом вычитаем.
|
Loading…
Reference in a new issue