# ООУИ 23/24. Финал, первый тур
[TOC]
## Творческое
### Квантовое шифрование
#### Балл: 2
#### Условие:
В последние годы область квантового шифрования претерпела значительные изменения, став одним из наиболее обсуждаемых направлений в информационной безопасности. Квантовое шифрование использует принципы квантовой механики для обеспечения безопасности передачи информации, что теоретически делает её невосприимчивой к взлому с помощью классических и даже квантовых вычислений.
**Задание:**
Ваша задача — провести анализ перспектив, пользы и угроз, связанных с применением квантового шифрования в информационной безопасности. Ваш ответ должен включать следующие аспекты:
1. Перспективы развития квантового шифрования:
* Оцените потенциал квантового шифрования и его возможное влияние на будущее информационной безопасности.
* Проанализируйте, какие технологические и теоретические проблемы ещё предстоит решить.
2. Польза квантового шифрования:
* Опишите, как квантовое шифрование может улучшить защиту данных и коммуникаций.
* Приведите примеры областей применения, где квантовое шифрование могло бы принести наибольшую пользу.
3. Угрозы и вызовы, связанные с квантовым шифрованием:
* Рассмотрите потенциальные угрозы, которые квантовое шифрование может представлять для существующих систем безопасности.
* Обсудите, какие вызовы стоят перед обществом и специалистами в области информационной безопасности при внедрении квантовых технологий.
**Требования к ответу:**
Ваш ответ должен быть подробным и аргументированным.
По возможности, подкрепите свои утверждения примерами.
Ожидается критический анализ представленных данных и мнений.
**Примеры для вдохновения:**
Пример пользы: Банковская система может использовать квантовое шифрование для обеспечения абсолютной безопасности транзакций и защиты от кибератак.
Пример угрозы: Развитие квантовых компьютеров может сделать устаревшими существующие методы криптографии, что потребует пересмотра подходов к защите конфиденциальной информации.
**Формат сдачи:**
Ответ предоставляется в форме эссе. Ожидается чёткое структурирование текста, наличие введения, основной части и заключения. Ответ сохранять на рабочем столе с названием "твроческая задача Квантовое шифрование"
### Incident manager
#### Балл: 2
#### Условие:
**Задание:**
Указано в приложенном файле
**Требования к ответу:**
Ваш ответ должен быть подробным и аргументированным.
По возможности, подкрепите свои утверждения примерами.
Ожидается критический анализ представленных данных и мнений.
**Формат сдачи:**
Ответ предоставляется в форме эссе. Ожидается чёткое структурирование текста, наличие введения, основной части и заключения. Ответ сохранять на рабочем столе с названием "твроческая задача Incident Manager"
## Paper
### AND or OR?
#### Балл: 1.5
#### Условие:
Составьте таблицу истинности для следующего логического выражения:

Здесь используются следующие логические операции:

Вам необходимо построить таблицу истинности для данного выражения, учитывая все возможные комбинации значений переменных X, Y и Z которые могут быть либо 0 (ложь), либо 1 (истина).
Данное задание необходимо делать на бумаге, описывая ход решения
#### Решение:
Таблица истинности данного выражения

### Виженер
#### Балл: 1.5
#### Условие:
Вам необходимо с помощью представленной ниже таблицы и шифра Виженера выполнить
две задачи:
1. Зашифровать фразу «ctf its easy» с ключевой фразой «some key»
2. Расшифровать фразу «kmx c lnoiqg onixsgk hkimgk» используя ключевую фразу «ctf»
Так же необходимо описать алгоритм и представить псевдо-код программы, позволяющей
производить шифрование/дешифрование произвольной фразы с указанием ключа.

#### Ответ:
#### Решение:
## Web
### GetTheFile
#### Балл: 1
#### Условие:
Just read file and get your points!
http://10.90.138.119:5555
#### Ответ: ctf{51mpl3_w4y_u51n6_4n07h3r_5ch3m3}
#### Решение:
## PWN
### ha-ha, classic
#### Балл: 1
#### Условие:
It's just classic pwn task!
nc 10.90.138.119 5050
#### Ответ: ctf{0V3rF10W_MY_8UFF3r}
#### Решение:
Для начала декомпилируем бинарный файл

Тут сразу бросается в глаза функция strcmp - намек на переполнение буфера памяти.
А еще есть пара констант заданного размера, их можно декодировать по примеру ниже:

и получить INNO и HELLO, при чем эти строки сравниваются, но есть еще ввод.
В целом, если привести в исходный вид, то получим следующий код:

Здесь видим классический пример категории, а именно переполнение буфера на key[10], решение для такой задачи будет выглядеть так:

Осталось подключиться по netcat и повторить это на сервере.
## Forensic
### hacker
#### Балл: 1
#### Условие:
My computer was hacked! I just get some strange file from hacker and message "try to find me, friend". Can you help me?
#### Ответ: ctf{H4CK_7H3_P14N37}
#### Решение:
Определяем, что перед нами образ диска:

Монтируем его:

Видим кучу файлов-картинок, с разными изображениями. Копаемся в них, ищем что-то интересное, доходим до EXIF данных.

Видим base64 в строке user comment, декодируем

## Reverse
### Slowly
#### Балл: 1
#### Условие:
This code is so slowly... But i very need flag!
#### Ответ: CTF{510W_45_5N411}
#### Решение:
Необходимо сделать декомпиляцию бинарного файла, получается такой результат:


Видим кучу функций и вызовов, а еще странный **sleep**
Два варианта решения - попытаться из каждой функции получить ее вывод и составить ручками флаг, или просто убрать sleep любым способом, поставивь на него брейки или пересобрав в целом.
Исходный код задачи:

## Network
### Двойное рукопожатие
#### Балл: 1
#### Условие:
Наш сервер слушает порт 31337. Если вы подключаетесь только одним способом, то в ответ - тишина. Если же подключаться по правильной схеме, а-ля port-knocking, то сервер вам обязательно ответит. Я еще не разобрался в комбинации, но у других коллег это получалось. Сейчас суббота, они недоступны.... помогите!!!
#### Ответ: CTF{hWjFwQ8BvknXY73mDocv}
#### Решение:
Необходимо было взаимодействовать с сервером по следующему алгоритму:
1. Устанавливаем tcp-соединение: `nc 127.0.0.1 31337`
2. Отправляем сообщение по udp-протоколу на тот же номер порта: `echo "Hello, Server!" | nc -u 127.0.0.1 31337`. Соединение из пункта 1 не закрываем
3. Теперь по соединению из пункта 1 нужно отправить какие-нибудь данные (любой текст), тогда сервер ответит вам правильным флагом
## Misc
### file
#### Балл: 1
#### Условие:
Файл без опознавательных знаков был замечен на компьютере главного бухгалтера. Узнайте, что было спрятано, и являются ли эти данные критичными?
#### Ответ: CTF{yPp8iPenT3Sfbhv6AlqL}
#### Решение:
Файл был преобразован по следующему алгоритму:
```bash!
#!/bin/bash
# Create a file named today.txt with specific content
echo "CTF{yPp8iPenT3Sfbhv6AlqL}" > today.txt
# Create a ZIP archive named today.zip with password protection
zip -P '2024-03-16' today.zip today.txt
# Generate a random name for the Zstandard archive
# This uses the UUID tool to generate a unique name
random_name=$(uuidgen)
# Compress the ZIP file into a Zstandard (.zst) archive with the random name
tar -zcvf "${random_name}".tar.gz today.zip
mv "${random_name}".tar.gz "${random_name}"
rm today.txt today.zip
# Display the name of the generated Zstandard archive
echo "Generated tar archive: ${random_name}"
```
Требовалось восстановить цепочку и получить файл:
1. узнать тип файла (tar.gz) и разархивировать его
2. поработать с файлом today.zip, подобрав пароль (актуальная дата - 2024-03-16), разархивировать
3. прочитать файл today.txt
## PPC
### печь
#### Балл: 1
#### Условие:
на вход вам дана последовательность слов, в ответ необходимо отправить количество глаголов (в инфинитиве). Раундов будет много.
В случае, если слово является существительным и глаголом, используется вариант глагол (например, печь).
#### Ответ: CTF{s1dMp0LILYYLtn19aPVH}
#### Решение:
Исходный код сервера
```python
import random
import select
import sys
verbs = []
nouns = []
with open('verbs.txt', 'r') as f:
verbs = [x.rstrip() for x in f.readlines()]
with open('nouns.txt', 'r') as f:
nouns = [x.rstrip() for x in f.readlines()]
def find(input, data = []):
return len(set(input).intersection(set(data)))
for i in range(100):
result = []
verbs_count = 0
nouns_count = 0
for j in range(100):
if random.random() > 0.3:
result.append(random.choice(verbs))
else:
result.append(random.choice(nouns))
print(" ".join(list(set(result))))
i, o, e = select.select( [sys.stdin], [], [], 3 )
if len(i) == 0:
print('Time is up!')
exit()
count = sys.stdin.readline().strip().rstrip()
if int(count) == find(result, verbs):
print('Good! Next round...')
else:
print('Wrong answer! Count is ', find(result, verbs))
exit()
print('CTF{s1dMp0LILYYLtn19aPVH}')
```
Алгоритм решения такой:
1. Собрать все слова в словарь
2. Отфильтровать те, которые не являются глаголами (их значительно меньше, около 20 штук)
3. Написать алгоритм, который на основе текущего набора слов просчитывает количество глаголов и отправляет ответ на сервер
4. Пример такого скрипта находится в коде сервера, функция **find**