# ООУИ 22/23. Отборочный этап.
[TOC]
## Misc
### Music hunter 1
#### Условие
The answer is the English name of the composition, the beginning of which is kindly provided in the file.
Answer must consist of lowercase letters and without spaces.
NB! flag format: CTF{...}
#### Решение
Используем гугл картинки и методом пристального взгляда находим подходящее произведение
### Music Hunter 2
#### Условие
Sounds pretty weird, right? Maybe it's not a melody?...
NB! flag format: CTF{...}
#### Решение
Под каждый символ флага выделен отдельный такт. Буквенное обозначение ноты - это отдельная буква (A-F), а количество четвертей в длительности такта с паузами - число. Фермата (перевернутая круглая скобка с точкой) над нотой или паузой обозначает начало слова, которое необходимо отделить нижним подчеркиванием.
## PPC
### Image collector
#### Условие
You just need to glue the image from the pieces.
Image size: 697x111
#### Решение
```python
from PIL import Image
w, h = 697, 111
piece_w, piece_h = 17, 3
img = Image.new('RGB', (w, h))
i = 1
for y in range(0, h, piece_h):
for x in range(0, w, piece_w):
img.paste(Image.open(f'pieces/{i}.png'), (x, y))
i += 1
img.show()
```
### We are looking for primes
#### Условие
We are looking for prime numbers!
Please send as much as possible
#### Решение
```python
from pwn import remote
def prime_generator():
yield 2
n = 3
while True:
is_prime = True
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
is_prime = False
break
if is_prime:
yield n
n += 1
conn = remote('', 9002)
conn.recvline()
generator = prime_generator()
while True:
if conn.recv().decode() != 'Next number: ':
conn.sendline(b'0')
break
conn.sendline(str(next(generator)).encode())
print(conn.recvuntil(b'}').decode())
```
### Tupper enjoyer
#### Условие
The Tupper's formula should help👍
#### Решение
```python
from pwn import remote
from PIL import Image
from pytesseract import image_to_string, pytesseract
pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract'
conn = remote('', 9004)
conn.recv()
for _ in range(500):
k = int(conn.recvuntil(b';', drop=True).decode().replace('k=', ''))
image_bits = [[int((((y + k) // 17) // (1 << (17 * x + ((y + k) % 17)))) % 2 > 1 / 2) for x in range(105, -1, -1)] for y in range(17)]
image = Image.new("1", (106, 17), '#000')
for y in range(17):
for x in range(106):
image.putpixel((x, y), int(image_bits[y][x]))
conn.sendline(image_to_string(image, lang='eng').split('\n')[0].replace('.', '').replace(':', '').encode())
print(conn.recvuntil(b'}'))
```
## Crypto
### My first cipher
#### Условие
I've invented a new cipher!
Check how it works)
#### Решение
Зашифрованная строка рассчитывается как произведение временной метки в формате UNIX на момент генерации и числа, образованного соединением ASCII-кодов символов изначальной строки, при необходимости дополненных нулями слева до трехзначного числа.
```python
s = str(int(open('flag.txt').read().split(': ')[1])//1671200299)
s = '0'*((3 - len(s) % 3) % 3) + s
print(''.join([chr(int(s[i:i+3])) for i in range(0, len(s), 3)]))
```
## Stegano
### Bripher
#### Условие
There are a lot of brackets that are easy to get lost in...
#### Решение
Количество последовательно идущих скобок одного типа (открывающая/закрывающая) - один из символов флага в ASCII.
### Рей наносит ответный удар
#### Условие
Кто я?
Аянами Рей.
А кто ты?
Аянами Рей.
Ты тоже Аянами Рей?
Да. Я та, кого знают как Аянами Рей.
Мы все те, кого знают, как Аянами Рей.
#### Решение
Имя файла из архива в гифке - это координаты рассматриваемого пикселя в анимированном изображении. Красная составляющая цвета этого пикселя для каждого фрейма - символ в ASCII, а последовательность символов (с каждого фрейма) образует пароль от архива.
```python
from PIL import Image, ImageSequence
print(''.join([chr(frame.convert('RGB').getpixel((228, 69))[0]) for frame in ImageSequence.Iterator(Image.open('ayanami.gif'))]))
```
## Admin
### /bin/...
#### Условие
В мире Linux так много оболочек командной строки, что запомнить их все просто не хватает сил! В этой задаче мы загадали название одного из шеллов, только он подойдет. Попробуй угадать, какой ответ. Попыток не ограниченное количество.
#### Решение
zsh
## Web
### Captcha
**Условие**
**Решение**

Необходимо было решить 100 однотипных проверок на то, что вы - не робот. Время ограничено - 100 секунд.
При открытии сайта шел GET-запрос на получение новых данных (GET /code), в ответ приходило следующее:
```
16FA00920F84
```
Если внимательно смотреть в код, то ширина контейнера слева (красного), зеленого и справа (тоже красного) генерируется на основе этих пришедших данных.

1. Разбиваем данный hex-код на три равных части по 4 символа
2. Преобразуем в десятичный вид
3. Делим на 100
4. Чтобы получить правильный диапазон, нужно было посчитать значение первого элемента (левая граница), а также сумму первого и второго (правая граница), и выбрать любое значение из этого диапазона в качестве ответа. Отправить запрос на сервер и проделать еще 99 раз
```bash=
curl 'http://localhost:3000/code' \
-X 'POST' \
-H 'Accept: */*' \
-H 'Content-Type: application/json' \
-H 'Origin: http://localhost:3000' \
-H 'Cookie: session=NldrlM85wHXoKAObI4PM; csrf_token_0bc3c2f13ccd1516eaa022809224b72ea843ff27809ff70e7a79601ab77727a7=uvk/iYuRqMWygA5KQ7hzW5vhRPLEN2QOCoilFn/J4po=; csrf_token_806060ca5bf70dff3caa0e5c860002aade9d470a5a4dce73bcfa7ba10778f481=QZesnxjRJv1qCS92Bvixwi1wfPfQVePh3sIeUNL6Hs8=; csrftoken=Cx2QFPNur3cJqb5CjwLlIRtuBPWg5YfN67qk8SkKt04b9DmoS1SqpSzCEX0opKIb' \
-H 'Content-Length: 16' \
--data-binary '{"code":95.3743}'
```
## Forensic
## Damaged disk
**Условие**
**Решение**
Инспектируем файл - получаем информацию о том, что это образ диска, но нужный нам файл удален. Система ext4, можно применить утилиту extundelete
`sudo extundelete --restore-all deleted_file.img`
в папке RESTORED_FILES будет искомый флаг
`-rw-r--r-- 1 root root 26 Feb 24 16:57 file.12`
## Reverse
### Guess
**Условие**
**Решение**
Необходимо декомпилировать данный jar-файл с помощью утилиты **jd-gui**

В исходном коде видно, что програма выдаст правильный ответ - результат **xor** операции двух значений, только при правильном входном числе. Здесь можно подобрать правильное число для выполнения условия (альтернативный способ решения), или сделать данную операцию вручную.
## Paper
### ЭЦП
**Условие**
Электронная цифровая подпись (ЭЦП) даёт право удалённо подписывать документы, как будто бы её владелец присутствует лично на сделке. Расскажите, как такое возможно и как внутренне устроен процесс выпуска ЭЦП, подписание документов и проверка подлинности. Для этого, предлагаем ответить на вопросы:
1. Какой механизм/функция лежит в основе ЭЦП?
2. Какие бывают алгоритмы, используемые в подписи? Перечислите несколько популярных, а также укажите их характеристики (битность, симметричность, на чем основаны).
3. Существуют ли российские аналоги алгоритмов или ПО для работы с ЭЦП? Если да, укажите название и их основные характеристики, как в пункте 2.
4. Как происходит процесс выпуска ЭЦП? Нарисуйте блок-схему, напишите псевдокод с комментариями или по пунктам опишите все детали (в хронологическом порядке).
5. Как происходит процесс подписи документа и использованием ЭЦП? Нарисуйте блок-схему, напишите псевдокод с комментариями или по пунктам опишите все детали (в хронологическом порядке).
6. Как происходит процесс проверки подлинности подписи для документа и использованием ЭЦП? Нарисуйте блок-схему, напишите псевдокод с комментариями или по пунктам опишите все детали (в хронологическом порядке).
7. Для хранения ЭЦП используют USB-устройства (так называемые токены), расскажите, как работает данное устройство? Где надежнее хранить ЭЦП, на данном устройстве или на компьютере?
8. Перечислите уязвимости в конкретных реализациях алгоритмов ЭЦП (включая устаревшие технологии).
**Решение**
1. В основе лежат алгоритмы асимметричного шифрования (в большей степени) и симметричного шифрования (в меньшей). В механизме создания и проверки ЭЦП также присутствуют хэш-функции
2. RSA (2048/4096 бит, асимметричный шифрование с закрытым и открытым ключом), DSA (1024 бит), ГОСТ Р 34.10-2012 (эллиптические кривые, 512/1024), ECDSA (160/224/256 бит, эллиптические кривые)
3. ГОСТ Р 34.10-2012 и ECDSA на базе эллиптических кривых. ГОСТ Р 34.10-94 и DSA на базе полей Галуа. ПО - CryptoPRO
4. 
5. 
6. 
7.  Токен хранит электронную подпись и цифровой сертификат. В отличие от флешки, на токенах данные защищены паролем и дополнительными средствами безопасности. Рутокены имеют сертификацию ФСТЭК/ФСБ, что соответствует требованиям 63-ФЗ. Надежнее ЭЦП хранить именно на таких съемных носителях.
8. RSA: Генерация простых чисел (схема с общим модулем n), Малые значения открытой/секретной экспоненты, атака и использованием китайской теоремы об остатках. ECDSA/DSA: уязвимость CVE-2018-0495 с воссозданием закрытых ключей.
### Маска подсети
Условие:
Три компании A, B и C арендуют офисные помещения на одном этаже бизнес-центра. Единственный доступный провайдер подключил их к одному управляемому L2 коммутатору. Ваша задача:
1. Предложить вариант по разграничению доступа компаний к сетям друг друга. Чтобы устройства из компании A не ходили в сеть компании C, и так далее. Если таких вариантов несколько, то напишите несколько вариантов. В ответе приветствуются схемы подключения, а также пояснения к ним.
2. Количество компьютеров в компании A – 15, B – 40, C – 30. Предложите такие варианты масок подсетей, которые бы покрывали нужды каждой отдельно взятой компаний с учетом того, что больше указанного выше количества устройств не планируется. Укажите адреса шлюза, широковещательного адреса, допустимый диапазон IP-адресов, а также маску подсети. Диапазоны IP-адресов компаний пересекаться не должны. Приведите расчеты маски подсети с использованием битовых операций.
Решение:
1. Так как коммутатор L2 управляемый, мы можем настроить разные VLAN (например 10, 20, 30), а также прописать белые списки MAC-адресов
2.
Компания A
```
шлюз: 10.0.0.1
маска подсети: 255.255.255.224/27
адреса: 10.0.0.2-10.0.0.30
широковещательный: 10.0.0.31
```
Компания B
```
шлюз: 10.0.1.1
маска подсети: 255.255.255.192/26
адреса: 10.0.1.2-10.0.1.62
широковещательный: 10.0.1.63
```
Компания C
```
шлюз: 10.0.2.1
маска подсети: 255.255.255.224/27
адреса: 10.0.2.2-10.0.2.30
широковещательный: 10.0.2.31
```