Merge pull request 'silmaulviel reverse tasks upload' (#1) from silmaulviel-tasks-1 into main
This commit is contained in:
commit
189fa7ad08
12 changed files with 201 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-им, потом вычитаем.
|
BIN
tasks/Возвращение зашифрованного файла/Исходники/decrypt
Normal file
BIN
tasks/Возвращение зашифрованного файла/Исходники/decrypt
Normal file
Binary file not shown.
|
@ -0,0 +1,32 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
|
@ -0,0 +1,2 @@
|
||||||
|
ctf{0h_c0ngr4tz_y0u_g0t_th1s!}
|
||||||
|
|
BIN
tasks/Возвращение зашифрованного файла/Файлы для таска/cryptor2
Normal file
BIN
tasks/Возвращение зашифрованного файла/Файлы для таска/cryptor2
Normal file
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
c}`v<emb0yuH‰€f<E282AC>I<EFBFBD>zsM‚~„‰C†5’ ()
|
53
tasks/Зашифрованный файл/README.md
Normal file
53
tasks/Зашифрованный файл/README.md
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
Условие (можете поменять если придумаете что-то эпичнее):
|
||||||
|
|
||||||
|
Нас взломали и зашифровали все файлы. Нам удалось извлечь шифровальщик, но мы понятия не имеем, как расшифровать их. Поможете? Вот вам шифровальщик и пример зашифрованного файла, кстати.
|
||||||
|
|
||||||
|
Флаг: ```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 для получения ответа.
|
31
tasks/Зашифрованный файл/Исходники/encrypt_file.cpp
Normal file
31
tasks/Зашифрованный файл/Исходники/encrypt_file.cpp
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
1
tasks/Зашифрованный файл/Исходники/flag.txt
Normal file
1
tasks/Зашифрованный файл/Исходники/flag.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
ctf{th1s_x0r_1s_s1mpl3}
|
BIN
tasks/Зашифрованный файл/Файлы для таска/cryptor
Normal file
BIN
tasks/Зашифрованный файл/Файлы для таска/cryptor
Normal file
Binary file not shown.
2
tasks/Зашифрованный файл/Файлы для таска/flag.enc
Normal file
2
tasks/Зашифрованный файл/Файлы для таска/flag.enc
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
ctn{|h9sWx8rW1{_{1epd3u
|
||||||
|
|
Loading…
Reference in a new issue