[2021] IT-GOD ZION WriteUp

[2021] IT-GOD ZION WriteUp

Rustam @SecondFry Gubaydullin

Preface

Начнем с shameless selfplug.

Привет, на связи Рустам (в Школе – oadhesiv, в Discord – https://discord.gg/At857WM, в телеге найдешь сам), ищу мощных пепег на фан в EVE Online.
Пиши, если тебе что-то говорит – праксис дрейк ц5 фарм дрифтеров. БЛОПсы. слив дедспейс найтмара в пвп. https://www.youtube.com/user/SecondFry

До начала соревнования на сайте были опубликованы source map, из которых можно было достать описание каких-то заданий, которые не были использованы, и дешифратора AES256, который без заданий вряд ли тебе потребуется. Остальное, так или иначе, использовано не было. Флаги до старта сабмитить не давало (проверял).

TOC

hell0 z10n
fr3qu3ncy
h0w much 1s the f1sh?
an0th3r bas3
h3adless
w0nderland
z10n v01ce
sham1r secr3t
on1on
b4n4n4s
Поскриптум #1
Поскриптум #2

hell0 z10n

Дается картинка и хинт "Eclipse Xavier Imperative Forbidden".

JPG приложенный к первому таску

Из хинта сразу понятно, что дело в EXIF – формате передачи метаданных внутри файлов (RTFM есть на вики – https://ru.wikipedia.org/wiki/EXIF).

Для удобного доступа к этим данных можно использовать утилиту exiftool. На маке она доступна через brew.

% brew install exiftool
% exiftool image.jpg
ExifTool Version Number        : 12.30
File Name                      : kek22.jpeg
...
Image Description              : 01011010 00110001 00110000 01001110 01111011 01100001 01110100 01100001 01100100 01100001 01110100 00110011 01101101 01011111 01100110 00110001 01111000 00110011 01011111 01110100 00110011 01110010 01100011 00110011 01110011 01011111 01110100 01110011 00110000 01101101 01011111 00110011 01101000 01110100 01111101
Image Size                     : 770x862
Megapixels                     : 0.664

Видим бинарные данные в Image Description, переводим в строку, например, так:

% node
> String.fromCharCode(...'01011010 00110001 00110000 01001110 01111011 01100001 01110100 01100001 01100100 01100001 01110100 00110011 01101101 01011111 01100110 00110001 01111000 00110011 01011111 01110100 00110011 01110010 01100011 00110011 01110011 01011111 01110100 01110011 00110000 01101101 01011111 00110011 01101000 01110100 01111101'.split(' ').map(x => '0b' + x).map(Number))
'Z10N{atadat3m_f1x3_t3rc3s_ts0m_3ht}'

По шагам описываю финт руками:

// Кладем строку в какую-то переменную.
const description = '01011010 00110001 00110000 01001110 01111011 01100001 01110100 01100001 01100100 01100001 01110100 00110011 01101101 01011111 01100110 00110001 01111000 00110011 01011111 01110100 00110011 01110010 01100011 00110011 01110011 01011111 01110100 01110011 00110000 01101101 01011111 00110011 01101000 01110100 01111101';

// Разбиваем строку через пробелы.
const arrayOfSymbols = description.split(' ');

const preparedArray = arrayOfSymbols
  // Добавляем к каждому кусочку в начале 0b.
  // 01011010 => 0b01011010
  .map(x => '0b' + x)
  // Просим JS спарсить это как число.
  .map(Number);

// Вызываем стандартный метод преобразования массива чисел в строку.
const flag = String.fromCharCode(...preparedArray);

console.log(flag);
// 'Z10N{atadat3m_f1x3_t3rc3s_ts0m_3ht}'

UPD1: @awesomesk1ll указывает, что я забыл, что флаг надо было после получения перевернуть. Т.е. настоящий флаг Z10N{th3_m0st_s3cr3t_ex1f_m3tadata}. Я с этого пригорел и память удалила плохие воспоминания.

fr3qu3ncy

Дается строка букв и хинт "читай название".

dogieofebghcffebdiecfgcifabfagfgfdeafbbeoeabiobhceagoaaddedghoohbideegichafbi

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

Отмечаем такую картину.

@Wilbur скинул в чат

Связь с духами и игра на бубне привела @Swarm_Host к тому, что:

const step1 = 'dogieofebghcffebdiecfgcifabfagfgfdeafbbeoeabiobhceagoaaddedghoohbideegichafbi'
  // Разбиваем строку на массив букв.
  .split('')
  // Превратить буквы в их индексы в алфавите.
  // Букве o назначаем ноль.
  .map(x => x === 'o' ? 0 : x.charCodeAt(0) - 96)
  // Объединяем, смотрим, что получилось.
  .join('');
console.log(step1);
// 40795065278366524953673961261767645162250512902835170114454780082945579381629

Превращаем это число целиком из dec в hex. Я использовал https://www.rapidtables.com/convert/number/decimal-to-hex.html.

Получаем 5A31304E7B6C3374743372735F6672337175336E63795F616E616C797331737D.

Разбиваем в текстовом редакторе на пары символов простой регуляркой s/(..)/\1 /g.

String.fromCharCode(...'5A 31 30 4E 7B 6C 33 74 74 33 72 73 5F 66 72 33 71 75 33 6E 63 79 5F 61 6E 61 6C 79 73 31 73 7D'
  // Разбиваем по пробелу.
  .split(' ')
  // Дополняем каждую пару 0x, хотя это можно было сделать и в регулярке замены :D
  .map(x => '0x' + x)
  // Парсим как число
  .map(Number)
)
// 'Z10N{l3tt3rs_fr3qu3ncy_analys1s}'

h0w much 1s the f1sh?

Дается pcap файл и хинт указывающий на беспроводных акул, что сразу же намекает на Wireshark.

pcap файл содержит в себе информацию о сетевом трафике, происходившую в какой-то момент времени.

Wireshark же дает возможность посмотреть на него визуально. Для любителей консоли можно было бы использовать tcpdump.

Интерфейс Wireshark. Видно много какого-то трафика

Как тут проще всего разобраться? Сначала посмотрим в незашифрованный трафик – то есть трафик, не покрытый TLS (простыми словами, это алгоритм, который используется, когда ты посещаешь HTTPS вебсайты). На скрине выше в колонке Protocol видно разные типы трафика.

Также не будем пока что думать о localhost трафике – этот трафик идет с машины на нее саму же. Понадеемся, что он просто мусорный.

Я бы мог сейчас расписать фильтр, который выберет такие пакеты, но правды ради я просто скроллил файл и смотрел на строки, применяя ограничения, которые описал выше. Довольно быстро обнаруживаем запрос по HTTP на какой-то околозионный домен.

Домен не отвечает, я проверял

Далее я отфильтровал трафик по адресу назначения ip.dst == 10.6.143.189, но проще было бы спросить у Wireshark просто http трафик.

ip.dst == 10.6.143.189
http

Видим, что происходит POST запрос, в котором еще и передаются какие-то 414 байт данных. Обычно при помощи POST передаются данные форм, загружаются файлы и в REST API, например, создаются новые сущности. Делаем вывод, что это то, что нужно.

Кликаем на строке с POST запросом ПКМ, выбираем Follow -> TCP Stream. Wireshark вежливо выдает нам новое окошко с отправленными и полученными данными.

Окошко

Видим, что загружался файл flag.zip, по бинарному выводу этого файла видим, что внутри у него flag.txt. Достаем данные любым удобным способом (я выбрал Show data as: binary -> Save as -> binwalk -e этих данных). Распаковываем архив, читаем файл.

% brew install binwalk
% binwalk -e wiredata

DECIMAL      HEXADECIMAL    DESCRIPTION
--------------------------------------------------------------------------------
814          0x32E          Zip archive data, at least v2.0 to extract, compressed size: 61, uncompressed size: 93, name: flag.txt
1019         0x3FB          End of Zip archive, footer length: 22

% cat _wiredata.extracted/flag.txt
lorem ipsume
Shaaaaarks

Z10N{sharksaremycrash3s}

ZZZZZZZZZZZZZZZZZZZZZZZZZ

Yeah yeah yeha

an0th3r bas3

Дается строка :wWx%{ae;R]4[@9jto8=^<FBj$X.6*XilECL и хинт "Ре Минор и До Мажор. Он знает их номера".

По клику на "Он" открывается фото песеля по имени "Бетховен"

Название таска сразу намекает на кодирование символов при помощи какого-то base алгоритма. Ре Минор и До Мажор указывают на симфонии Бетховена 9 и 1 соответственно.

Раскодировав строку при помощи base91 (я использовал https://www.dcode.fr/base-91-encoding) получаем флаг: Z10N{beeth0weens_m00n_s0nata}.

h3adless

Дается описание "Tomcat" и хинт "a-X-ator, di-X, lon-X-ude". "Tomcat" является ссылкой на https://it-god-z1on.ru:8443/task/index.html.

Tomcat it is comrade

Я использовал https://wordmaker.info/starting-ending/a-ator.html, чтобы не думать и найти все слова английского языка, начинающие и заканчивающиеся на какие-то символы.

Из этого делается вывод, что X это git. Сразу же проверяю https://it-god-z1on.ru:8443/task/.git и вижу directory listing git-репозитория. Почему сразу же? Это классическая уязвимость, когда при деплое вебсервер натравливается на папку, где активен git-репозиторий. Все нормальные конфиги закрывают доступ к скрытым файлам (начинающимся с точки). Например, https://github.com/h5bp/server-configs-nginx/blob/main/h5bp/location/security_file_access.conf.

Дальше просто скачиваем себе этот репо и ищем в нем слово Z10N, так как все флаги в этом формате.

% wget -mpEk --no-parent robots=off --random-wait --no-check-certificate https://it-god-z1on.ru:8443/task/.git/
...

% cd it-god-z1on.ru:8443/task/
% git grep Z10N $(git rev-list --all)
c6671f2add9ddbdb9f0659ebd095b882ab0251f4:tomcat.apache.org/mail/flag.html:Z10N{loweonimalsandcots}

w0nderland

Дается картинка и хинт "Магические байты помогут, если заглянуть внутрь книги".

Красивое

Используем binwalk. Ранее я не стал углубляться в то, что это такое, так как как раз был подходящий таск под это. binwalk смотрит внутрь файла и ищет там разные спрятанные куски информации, используя сигнатуры файлов ("магические байты" из хинта – https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D1%81%D0%B8%D0%B3%D0%BD%D0%B0%D1%82%D1%83%D1%80_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2).

% binwalk -e alice.jpg

DECIMAL      HEXADECIMAL    DESCRIPTION
--------------------------------------------------------------------------------
0            0x0            JPEG image data, JFIF standard 1.01
2881114      0x2BF65A       Zip archive data, encrypted at least v1.0 to extract, compressed size: 12, name: How_long_is_forever? (3)
2881224      0x2BF6C8       Zip archive data, encrypted at least v1.0 to extract, compressed size: 45, uncompressed size: 33, name: flag.txt
2881523      0x2BF7F3       End of Zip archive, footer length: 22

% unzip _alice.jpg.extracted/2BF65A.zip
Archive: _alice.jpg.extracted/2BF65A.zip
[_alice.jpg.extracted/2BF65A.zip] How_long_is_forever? (3) password:

Внутри картинки оказывается архив. "Технология" производства таких файлов называется рарджипег (rarjpeg).

Архив внутри оказывается запароленный. По гуглению How long is forever? находится цитата, которую ошибочно приписывают Керролу, где Алисе на этот вопрос Белый Кролик отвечает Sometimes, just one second..

Связь с духами и игра на бубне привела @Swarm_Host к тому, что пароль justonesecond. На это было потрачено больше 8 часов...

... pkcrack на 33 байтовый флаг не помог, потому что для него нужно точное попадание в содержимое файла.
... john мог бы помочь, если бы была выбрана атака по словарю английского языка.
[_alice.jpg.extracted/2BF65A.zip] flag.txt password:
 extracting: flag.txt

% cat flag.txt
Z10N{WELC0ME_T0_TH3_RABB1TS_H0LE}

z10n v01ce

Дается wav файл и хинт "Лучше один раз увидеть, чем несколько раз услышать".

Открыв файл в программе для редактирования звука Audacity, видишь на спектрограмме следующее:

Да

Кстати, записью данных в спектограммы регулярно пользуются для пасхалок – например, https://killscreen.com/previously/articles/dooms-back-corrupt-youth-time-spectrograms/.

sham1r secr3t

Дается 7 разных AES шифрованных строк и хинты к каждой из них. Хинт к заданию рассказывает о Shamir's Secret Sharing Scheme – это способ разделить секрет на N частей, где K (K <= N) любых частей достаточно, чтобы собрать его обратно целиком (читаем, наслаждаемся – https://ru.wikipedia.org/wiki/%D0%A1%D1%85%D0%B5%D0%BC%D0%B0_%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B5%D0%BA%D1%80%D0%B5%D1%82%D0%B0_%D0%A8%D0%B0%D0%BC%D0%B8%D1%80%D0%B0).

Первый шифр

Ложка с цифрами

Переписываем цифры в буквы, получаем:

% node
> String.fromCharCode(...[4, 15, 0, 14, 15, 20, 0, 20, 18, 25, 0, 1, 14, 4, 0, 2, 5, 14, 4, 0, 20, 8, 5, 0, 19, 16, 15, 15, 14, 0, 20, 8, 1, 20, 0, 9, 19, 0, 9, 13, 16, 15, 19, 19, 9, 2, 12, 5, 0, 9, 14, 19, 20, 5, 1, 4, 0, 15, 14, 12, 25, 0, 20, 18, 25, 0, 20, 15, 0, 18, 5, 1, 12, 9, 26, 5, 0, 20, 8, 5, 0, 20, 18, 21, 20, 8, 0, 23, 8, 1, 20, 0, 20, 18, 21, 20, 8].map(x => x + 64))
DO@NOT@TRY@AND@BEND@THE@SPOON@THAT@IS@IMPOSSIBLE@INSTEAD@ONLY@TRY@TO@REALIZE@THE@TRUTH@WHAT@TRUTH

Что является знаменитой цитатой из Матрицы, где Нео гнет ложку в гостях у Пифии (могу ошибаться, смотрел последний раз хз когда). Ответ "There is no spoon", который согласно другому хинту надо использовать как THEREISNOSPOON.

Тут хотелось бы сказать, что было бы приятно, если бы все секреты во всех задач были бы консистентно написаны в одном кейсе (т.е., например, всегда uppercase без пробелов и символов). Ато в Алисе justonesecond, а тут и далее наоборот и не только...

Получаем первый кусок секрета:

1-a64d4c47f9a8458c86ea18ca22e76d0b0ba5c1ca9ce31d89c7215beadc75eadbcaf85abc561a17d7db

Второй шифр

Просит нас использовать ip + login без пробелов и знака плюса что-то из 5 серии 3 сезона сериала Mr. Robot.

Гуглим вики ARG по сериалу – https://wiki.gamedetectives.net/index.php?title=Mr._Robot_ARG/Season_3/Episodes#192.251.68.233.

Так как думать, в принципе, довольно сложно, перебираем все секреты как логины и все IP со страницы.

SMOrc
2-63c02d3a316d0b2bee3dcf3b11664bf65e011a6a5e7e4a4160d2da551365338c95b37be067bc9b9053
Пикрелейтед из сериала (спасибо @awesomesk1ll). Написано "use login z1on0101"

Третий шифр

Вел на сайт https://it-god-z1on.ru/images/fd9c04b8-8099-4a90-af38-82216504a777.html, где в исходнике страницы лежал ключ sometimes_you_need_to_dig_deeper.

ПКМ, view page source в хромиумных браузерах
3-06df1dc5b0d6a487ad2868813bc0890713baff5fb94ac97cf564bed73d00f39975e16d240adb86f151

Четвертый шифр

В описании два хинта: один "Фундаментальный предел точности, с которой известны определенные пары физических свойств", второй "слова на английском ловеркейсом без пробелов". Гуглится принцип неопределенности Гейзенберга. Ключ, соответственно, heisenbergsuncertaintyprinciple.

4-64d8a85cc87ae4ee563d1ac7e85160ce8d10597ca52fa45e8649a6b7976e13982794d1bb60d5262cb6

Пятый шифр

В описании была цитата Леонардо да Винчи о том, что мир тлен – "Где умирает надежда, там возникает пустота.". Пароля не было, нужно было использовать пустую строку (спасибо @Swarm_Host). Этот кусок был мною не использован.

Шестой шифр

Содержал серию хинтов, которые надо было соединять один к другому "Сумма чисел на рулетке", "Талант", "Владелец Java", "Их четыре [Б, З, О, ???]. Четверое на английском ловеркейсом и есть пароль".

Сумма чисел на рулетке – 666.

"666 талант" привело @Swarm_Host к царю Соломону.

Владелец Java – Oracle. "оракул соломон" выводит на гадальные карты таро "Оракул Царя Соломона".

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

ЗНАЧЕНИЯ КАРТ АМУЛЕТА:
Карта I – СРЕДСТВА К СУЩЕСТВОВАНИЮ: предъявитель этого амулета получит большую прибыль, прирост богатства, и удачу во всем, что он делает.
Карта II - ОТНОШЕНИЯ: предъявитель этого амулета найдет романтические отношения, которые больше всего подходят ему или улучшаться существующие отношения.
Карта III -ЗДОРОВЬЕ: предъявитель этого амулета улучшит свое здоровье и будет защищен от ранения и болезни.
Карта IV - БЕЗОПАСНОСТЬ И ЗАЩИТА: предъявитель этого амулета будет спрятан и защищен от злого глаза и отрицательных энергий. Его путь будет безопасен и все действия успешны.

Карта "Средства к существованию" на английском называется "Livelihood".

Пароль – sha256(livelihood). Использовать SHA256 было сказано в хинте.

6-75fc990f5fa8f6990dcfc72e48540043dfd4dad2745c33dcbcc020dc335d90183226dd58d98cb64e98

UPD4: @ef1652b7 указывает, что слово livelihood можно было в течение минуты сбрутить по словарю всех английских слов, ограничив себя словами начинающимися на букву L.

Седьмой шифр

Хинты указывали на пасхалку Биткоина, что-то начиющееся с "four favorites" и номер чего-то.

Пасхалка биткоина это 0x736B6E616220726F662074756F6C69616220646E6F63657320666F206B6E697262206E6F20726F6C6C65636E61684320393030322F6E614A2F33302073656D695420656854, гуглится прямо по Bitcoin easter egg.

[s]Четыре фаворита это толи книжка, толи что, по гуглению выходит Dominic Bevan Wyndham Lewis.[/s]

[s]Какое-то число, вроде как, указывает на расшированную пасхалку Биткоина, но этот кусок не был использован мною, поэтому не уверен, что да как.[/s]

UPD2: @ef1652b7 указывает, что правильный хинт должен был быть не "four favorites", а Hint #2 ... four [Second Part] favourites ..., используя который нужно было найти выпуск журнала The Times и получить второй частью Gordon Ramsay, а третьей – номер выпуска 69523.

@ef1652b7 прислал одну картинку из writeup из поскриптума #2
И вторую картинку тоже прислал @ef1652b7 из того же writeup

Итог

Идем на http://point-at-infinity.org/ssss/demo.html, вводим свои путь кусочков в раздел Combine, ставим Threshold на 5, получаем Z10N{sh4m1r_c4refully_keeps_y0ur_secrets}.

on1on

Дается AES256 зашифрованный текст и хинт "YJR SMDERT YP YJOD [IXX;R OD YJR DOC VJSTSVYRT MS,R GPT YJR,PDY VP,,PM LRUNPSTF ;SUPIY" с предложением посмотреть на клавиатуру.

По "YJR SMDERT YP YJOD [IXX;R OD YJR DOC VJSTSVYRT MS,R GPT YJR,PDY VP,,PM LRUNPSTF ;SUPIY" гуглился целиковый writeup на все это задание (и не только, читай поскриптум #2), откуда я заиспользовал решение первого и третьего слоя (потому что не прочел его целиком сразу, кек, надо было просто почитать).

Вкратце, надо было посмотреть на буквы слева от предложенных и получить "THE ANSWER TO THIS PUZZLE IS THE SIX CHARACTER NAME FOR THEMOST COMMON KEYBOARD LAYOUT", где первым ключом становится QWERTY.

По расшифровке изначального AES256 шифра получаем хинт "If you think we can't change the world, it just means you're not one of those who will.<...> is ours.", что указывает на Жака Фреско и его какой-то очень интересный спич. Так или иначе, ответ тут THECHOICE.

Следующий слой дает хинт "The last question. How did he stop this process? 42 7a 65 6c 63 20 53 6c 79 67 73 6e. At the end you will know the answer.". Здесь "42 7a 65 6c 63 20 53 6c 79 67 73 6e" это "Bzelc Slygsn", откуда гуглится опять тот же writeup и получается пароль LETTHEREBELIGHT и достается флаг Z10N{Th1s_on10n_mad3_m3_cry}.

UPD3: @ef1652b7 указывает, что Bzelc Slygsn нужно было расшифровать при помощи Vigener Cipher, ключом к которому был THELASTQUESTION. Результатом расшифроки стало бы Isaac Asimov. Пароль LETTHEREBELIGHT можно взять в конце книги указанного автора (@Swarm_Host рекомендует к прочтению).

b4n4n4s

Приведу текст задания целиком:

Алия приготовила 10 бананов для своих обезьянок и положила их в точку 0. Но вороватые обезьяны украли пару фруктов и утащили их по случайным коридорам к выходу, причем ни разу не пробегали одну и ту же точку.
Алия пошла к выходу и обнаружила, что в двери дырка размером в 1297 сантиметров. Алия очень мудрая, поэтому она сразу сообразила, что размер как-то связан с маршрутом убегающих обезьян...
Формат флага: Z10N{...}
w = [90, 49, 48, 78, 123, 87, 111, 114, 105, 120, 105, 85, 73, 105, 106, 98, 115, 72, 76, 104, 75, 73, 91, 104, 93, 115,
    105, 125]

g = [[0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
    [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
    [1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
    [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0],
    [0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0],
    [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0],
    [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1],
    [1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
Олды знают что это
Реакция олдов

lemin – это такой проект на старом графе обучения в Школе 21. По заданию нужно пустить муравьев по графу так, чтобы они максимально быстро добрались до выхода, с учетом того, что по ребру в один момент времени может путешествовать ограниченное количество муравьев (по весу связи в графе, угу).

В общем, довольно очевидно, что w из описания выше является весом узла на графе, а g описанием направленного графа связей.

Подсказка про размер дырки лично мне намекнула на то, что пока обезъянки бежали по коридорам, они кушали бананы и становились толще. Говоря более понятным языком при путешествии по графу вес пути будет суммой весой узлов и нужно найти такой путь, где вес 1297.

Что ж, лентяйничаем и используем готовые библиотеки на Python.

import networkx as nx
import numpy as np

# Массив весов точек
w = ...

# Граф связности
g = ...

# Переделываем связи в связи по весу, так как я ленивый и не хочу разбираться
# как задать вес узлу. Граф, все равно, должен быть направленный, поэтому похер.
# Связи из 0 в 4 будет весить как весит 4 нода, а из 4 в 0 – как 0 нода.
# UPD5: кажется, это, в целом, бесполезные действия, так как в конце я, все равно,
# считаю вес пути руками. штош.
new_g = []
for neighbours in g:
    ret = []
    for idx, connected in enumerate(neighbours):
        if connected == 0:
            ret.append(0)
        else:
            ret.append(w[idx])
    new_g.append(ret)

# кек пек ML
input = np.matrix(new_g)
# моя команда бигдата обнаружила что вы петухонист
graph = nx.from_numpy_matrix(input, create_using=nx.DiGraph)

# алгосы для бедных, гигачады импортят солвер флага Kappa
for path in nx.all_simple_paths(graph, 0, 27):
    weight = 0
    for node in path:
        weight += w[node]
    if weight == 1297:
        print(weight, path, ''.join([chr(w[x]) for x in path]))

Получаем два результата ("вороватые обезъяны украли пару фруктов").

1297 [0, 1, 2, 3, 4, 5, 6, 7, 12, 16, 19, 20, 26, 27] Z10N{WorIshKi}
1297 [0, 15, 1, 16, 26, 5, 6, 12, 9, 8, 19, 25, 27] Zb1siWoIxihs}

Поскриптум #1

Вот как так бывает – не хотел участвовать, а, в итоге, закончил третьим.
Спасибо @Swarm_Host, чату, организаторам.
Возможно, было бы круче, если было бы меньше угадаек и больше хардскилов.

Другие мои writeup – https://telegra.ph/WriteUps-11-21.

Поскриптум #2

По окончанию квеста я узнал, что был доступен "Райтап по бетховену, по алисе, по 8 и 9 заданию.", что, в принципе, позволяло пройти квест максимально быстро. Если бы не гадание какой же пароль к архиву в w0nderland, то за 2-3 часа можно было бы управится, а с writeup, вообще, за минут 40, наверное.

Хоть сейчас writeup недоступен, то, что было в Интернете один раз, остается там навсегда – кеш Гугла, Яндекса и WaybackMachine это вновь доказывают.

Keep Puzzle Challenge Write-Up Part 1 by hurek – https://disk.yandex.com/i/TZIEOP8HEjzNWA.
Keep Puzzle Challenge Write-Up Part 2 by hurek – https://disk.yandex.com/i/vjfSNdLd4bB-nA.
Keep Puzzle Challenge Write-Up Part 3 by hurek – https://disk.yandex.com/i/napZYP3iaYTivQ.

Report Page