2016

31 декабря 2016

И вот я снова подвожу итоги своего года. Зимний семестр прошлого курса я уже почти не помню. Одни из самых ярких событий — различные CTF-соревнования — я уже описывал в блоге. Летом снова участвовал в GSoC, и на этот раз вел блог. Правда, он на английском, поэтому я вынес его на отдельную страницу.

За год прошел несколько интересных релизов. Весной был неплохой SUPERHOT, ближе к лету — офигенный DOOM. Летом прошел оба дополнения к третьему Ведьмаку. Осенью прошел все части Batman от Rocksteady (реально круто в котором был сделан разве что бэтмобиль) и перепрошел обе части The Force Unleashed (они, кстати, на этот раз мне не сильно понравились), а также последний DMC (который мне не перестал нравиться, так что я в очередной раз прошел его на нескольких сложностях). Совсем недавно прошел новый Watch_Dogs 2 (в котором не оказалось ничего необычного) и Furi с его отличным стилем и саундтреком. Возможно, про что-то я уже и забыл. На следующий год я уже заготовил себе целую кучу всего в Steam, хоть и не знаю, когда буду во все это играть.

SUPERHOT DOOM Batman: Arkham Knight
DMC Watch_Dogs 2 Furi

Кроме GSoC из своих проектов можно отметить несколько игр. Две — учебные проекты, поэтому ничего сильно особенного в них нет, а вот третью я совсем недавно написал на Ludum Dare 37. Я уже написал длинный пост про нее (и на английском тоже), поэтому, наверное, рассказывать еще раз не буду. VK отключили публичный API для работы с аудио, поэтому теперь ни мой бот, ни мое дополнение для браузера не могут работать с аудиозаписями — ни прикрепить, ни поискать, ни как плейлист скачать.

На днях вот решил заняться переписыванием своего приложения, в котором я отмечаю, какие комиксы прочитал. Работает, в целом, оно схожим образом с предыдущим — через localStorage — но теперь информацию я взял с marvel.com (кроме того, только за последние два года, потому что основные серии прочитал уже до 2015), и теперь оно позволяет выбрать, какие серии комиксов показывать, а какие скрыть. В планах также сделать возможность назначить каждой серии свой цвет и переупорядочивать серии, чтобы первыми показывались одни, а следом уже шли другие. Это уже было реализовано в старой версии, но через код. А сейчас я хочу сделать так, чтобы это можно было делать прямо в браузере — тогда каждый пользователь сможет сам для себя выбрать, какие серии читать, каким цветом их подсвечивать и в каком порядке показывать. Кроме того, теперь прокрутка будет вертикальной, а дизайн теперь «для слепых» — с крупными плитками.

Каникулы только начались, на сессии, похоже, будет только один экзамен, а все остальное время можно будет отдохнуть: пройти какую-нибудь старую игру, поиграть с друзьями в кооперативе, почитать комиксы, посмотреть фильмы, заниматься своими проектами. У меня появился Манчкин, в который мы собираемся в скором времени зарубиться. Надеюсь, что хорошо проведу время, а следующий год будет только лучше уходящего. И всем желаю того же.

UNH4CK3D – post-mortem

27 декабря 2016

Идея для игры на мой первый LD пришла немного раньше, чем была объявлена тема. Поэтому я решил участвовать в Jam и о теме не задумываться. Моя игра — браузерный симулятор хакера с реалистичными терминальными командами.

Перед LD

Поскольку я решил участвовать в Jam, меня на самом-то деле не сдерживали правила «сделать все в одного» и «все ресурсы должны быть созданы за 48 часов», поэтому я сделал небольшой набросок. Это были статичные HTML-страницы с щепоткой CSS и JS — экран входа в систему и рабочий стол с несколькими иконками.

Кроме того, я спросил нескольких своих друзей, и они согласились помочь мне, поэтому я создал приватный репозиторий на Github.

День первый

В субботу у меня были занятия в универе. К счастью, первой была лекция о том, что я и так знал, поэтому я писал код. Так появился прототип терминала: никакой верстки, только JS-код, который я запускал через консоль разработчика в Firefox. Конечно, это не настоящий шелл, но он умел парсить подаваемую на вход строку на аргументы (работая со "строкой в кавычках" как с одним аргументом и поддерживая несколько escape-последовательностей вроде \n). Кроме того, работали пайпы |, потому что я уже придумал, зачем они мне понадобятся.

После занятий я вернулся в свою комнату. Первым делом нужно было добавить прототип в имеющийся набросок и сделать какой-нибудь интерфейс. На самом деле, все это я стримил на Twitch (хотя никто меня не смотрит), но не записывал.

Потом я начал добавлять новые страницы с свой «интернет»: простые, вроде Mailbox (совсем статичная) и системных страниц browseros вроде settings, admin и no_internet.

К концу дня я также добавил плеер Play, использующий YouTube API, и временный плейлист, чтобы проверить, что плеер работает.

Второй день

Во второй день мне помогали друзья. Один из них шарит в веб-разработке, но он был немного занят, поэтому его итоговый вклад оказался меньше, чем я ожидал. Второй с вебом никогда не работал, поэтому я попросил его заняться сюжетом и переводом. У меня уже были наброски для диалогов, но я в основном работал над другими вещами, поэтому я вкратце объяснил ему сюжет и вернулся к работе.

Во-первых, я начал работать над бэкендом игры, потому что хотел спрятать некоторые части игры от игрока. Поэтому я поднял легкую виртуалку и поставил туда LAMP, поскольку мой сайт хостится на таком же (а я собирался выложить игру на него). Тут в игру вступил PHP. Теперь игра состояла уже не из простых статичных HTML-страниц, и требовала запуска сервера. С другой стороны, теперь я мог сделать авторизацию и использовать базу данных, чтобы хранить прогресс игрока.

Бэкенд также отвечал за перевод: браузер пользователя отправляет серверу куку, и в зависимости от установленного значения я возвращают те или иные тексты в ответ. Я хотел сделать автоматическое определение языка пользователя по IP, но модуль PHP geoip не был доступен у меня на хостинге, поэтому впоследствии пришлось его открутить.

Далее были добавлены некоторые серверные системы: поиск, сеть и обработка URL. Их, конечно, можно было реализовать и на фронтенде, но тогда игроки могли бы смотреть в JS код и увидеть все доступные IP, URL и сайты в индексе поиска, чего я допустить не хотел.

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

Сеть — это набор объектов, представляющих собой узел. Каждый узел может иметь несколько имен (IP или текстовые имена) и набор открытых портов с некоторыми «сервисами» на них. С помощью этого я мог легко и просто добавлять новые компьютеры в игровую сеть, и различные сервисы на них (реализованы были только web и ssh).

Обработка URL парсит строку, введенную игроком в строке игрового браузера и ищет соответствие. Это просто набор захардкоженных строк (например, «search.com» перенаправляет на что-нибудь вроде «/pages/search/index.html»), но при обработке также учитывается сеть, так что если попробовать ввести <IP>:<port> в адресной строке, сервер попытается найти такой узел и посмотрит, есть ли на указанном порте веб-сервис. Если сервис там есть, будет отображена соответствующая страница.

Когда я закончил с этими системами, я стал работать над IRC, через который подается сюжет в игре. Я решил дать игроку выбор из нескольких заготовленных вариантов и добавить забавную механику нажатия клавиш, подсмотренную в SUPERHOT, для ввода выбранных вариантов. Еще я хотел, чтобы новые сообщения появлялись одно за другим, поэтому я получаю все новые сообщения через AJAX и показываю их по одному с указанной для них задержкой. Я не запоминал в базе данных статус сообщений, поэтому при обновлении страницы IRC мгновенно появлялись все новые сообщения. Еще круто то, что звук оповещений о новых сообщениях играет даже если уйти со страницы. Кстати, звук был создан с помощью sfxr.

К концу дня я получил диалоги от моего друга. Он хотел сделать вступление более плавным для игрока, поэтому добавил небольшую обучающую часть, в которой вы отвечаете своему бестолковому другу. Идея добавить несколько вариантов в этой части была полностью его, и мне она показалась довольно забавной.

День 3

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

В понедельник у меня снова были лекции, поэтому над чем-то сложным поработать не получилось бы, так что я просто переносил диалоги в игру: немного подправлял, придумывал имена персонажей, тестировал отображение сообщений в игре.

Потом занялся первым заданием: надо перейти на страницу веб-интерфейса, залогиниться с помощью выданных логина и пароля и посмотреть на стикер на мониторе. Забавно, что все пытались зазумить картинку и разглядеть надпись на стикере, а я думал, что раз на стикере написано мелко, игроки вернутся в IRC и посмотрят, что там изменилось.

Второе задание было немного сложнее: для него требуется терминал, но я знал, что хакеры не станут объяснять игроку, как его открыть и как им пользоваться, поэтому мне нужно было добавить подсказок. Поэтому я сделал блог скрипткидди, который запостил скриншот открытого терминала и страницы в браузере, через которую можно этот терминал открыть. Там также есть подсказка по поводу использования curl и curl | dash (это такой шелл в browseros). Правда, подсказок про ssh я не добавил.

Далее я стал делать различные доработки: добавил плейлисты (стандартный «плейлист игрока» и электронный «от Tkachov»), перевод (потому что мой друг не совладал со всем PHP в моем проекте), нарисовал иконки, переименовал пару вещей, и т.д.

После всего этого я немного устал, поэтому последние часы не стал тратить на создание нового контента, а просто выложил игру на сайт и запостил на ludumdare.com.

Прием игроков

Хоть я и знал, что игра работает нормально, я подумал, что она может оказаться слишком короткой, неинтересной или требующей от игроков знаний, которых у них обычно нет. Поэтому я был удивлен тому, насколько тепло игру приняли в комментариях. Я поставил галочку, чтобы разрешить анонимные комментарии, надеясь, что так получу больше отзывов, но ни разу не увидел анонимных комментариев на сайте, так что они либо сломаны, либо ими никто не пользуется.

Что удалось: похоже, игрокам понравилась идея, и многим полюбилось стучать по клавишам =)

Что не удалось: стучать по клавишам понравилось не всем; подсказок сделано мало; в игре не было сообщения, оповещающего игрока о том, что все закончилось.

Последнее я исправил, а все остальное оставил таким, каким оно было изначально. Хотелось бы сделать больше, но я не уверен, когда у меня появится время на это.

В мою игру играли TVGS на своем стриме, а запись выложили на YouTube, так что если вам хочется посмотреть, держите:

Кроме того, вы можете поиграть в нее в любом современном браузере без установки каких-либо плагинов. Я очень ценю отзывы, так что, пожалуйста, сообщите мне, что вы думаете об этой игре!

Kaspersky Industrial CTF + KrasCTF 2016

18 октября 2016

На прошедшей неделе наша команда приняла участие сразу в двух CTF: Kaspersky Industrial, в который мы прошли по итогам отборочных, и KrasCTF, на который просто подали заявку и приехали.

Первый проходил в Иннополисе, и полностью оплачивался организаторами. Нам приобрели билеты из Новосибирска в Казань (с пересадкой в Москве), встретили в аэропорту и привезли в Иннополис. Мы разместились в одном из корпусов для студентов. Блок, в котором мы жили, был неплохой: комната на троих, на двоих, кухня с плитой и холодильником, душ. Там же были одноразовые тапочки, зубные щетки, шампунь — прямо как в отеле, в котором мы жили во время RuCTF. Правда, в блоке было прохладно, и ничего с этим сделать не получилось.

Корпуса связаны между собой и с университетом сквозным переходом, что очень круто, поскольку можно не выходить на улицу и не проходить вахту по несколько раз. В столовой нас тоже кормили бесплатно. Причем там даже можно было выбирать, что взять. Сами же соревнования проходили посреди университета, где был установлен стенд из множества стоек и мониторов, на которых отображалось текущее состояние «автоматизированной системы». Взломом этой самой системы четыре участвующих команды и должны были заниматься. Все команды сидели напротив стенда на пуфах-мешках, и у каждой было по одному маленькому кофейному столику.

Первой задачей был вход в сеть. Для этого было три канала: Wi-Fi (с неизвестным паролем), модемы (с которыми непонятно, как работать) и локальная сеть (которую выдавали только после обеда). Пароль не входил в словари, поэтому подобрать его не удалось. Тогда организаторы сменили пароль на цифровой, но перебор всех вариантов занял бы пару дней, поэтому им пришлось раскрыть часть пароля — и тогда, наконец, пароль получилось узнать. После этого мы могли работать с машинами в сети и пытаться как-то их взломать или использовать. На многих серверах использовались «индустриальные» сервисы и протоколы, и нужно было разобраться, как с ними работать или взломать. Каждое «незаконное» действие участников оценивалось в некоторое число баллов, которые начислялись после совершения соответствующего действия.

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

Соревнования шли два дня: весь первый день, а также до обеда во второй день. По итогам наша команда набрала достаточно много баллов, но на несколько тысяч меньше, чем первая. За второе место нам пообещали Proxmark, но, поскольку нам нужно было торопиться на трансфер до аэропорта, на награждении нас не было, и призы мы получим только когда организаторы их отправят (вместе с футболками и сертификатами, которые нам также не выдали).

Через два дня после возвращения нас снова ждал самолет. Поездку на KrasCTF 2016 уже оплачивала администрация нашего университета. Мы пропустили открытие (как мы часто это стали делать в последнее время) и прилетели в конце дня перед соревнованиями. Там мы позвонили водителю, которого предоставили организаторы, и отправились в общежитие. На этот раз общежитие было рядом с тем корпусом СФУ, в котором проходит все мероприятие, но внешне оно оказалось еще хуже тех, в которых мы жили ранее. Нас поселили в гостевой блок из пяти комнат и кухни, а в каждой комнате был свой раздельный санузел. На кухне — холодильник, микроволновка, стиральная машина. В комнате — телевизор. Проводной сети в комнате не нашлось, зато был чей-то открытый Wi-Fi. В общем, мы заказали три XXL-пиццы в Papa Johns плюс одну 30 см по промокоду, съели их, и стали спать. Кровати, кстати, были очень широкие и мягкие, как это обычно бывает.

На KrasCTF мы приезжаем уже в третий раз, и особо соревнования не меняются. Нас приводят в один и тот же корпус, мы сдаем куртки в гардероб, проходим жеребьевку — и команды расходятся по своим отдельным комнатам. Все комнаты — терминальные классы, но с дополнительными столами. В этот раз электричество было выключено до начала соревнований. Сеть мы, кажется, тоже поднимали собственную — никакого Wi-Fi, роутера или патчкордов от организаторов.

Как и ранее, категории заданий были известны заранее. Но в этот раз мы распределились по категориям, и целенаправленно смотрели на задания, с которыми нам было бы проще справиться. Это принесло свои плоды: в первые же минуты я первым во всем соревновании сдал Recon 100, переместив нашу команду на первое место. С этого места мы ни разу не сместились, поскольку стали быстро набирать отрыв. Заданий здесь было больше, да и они были более классические, поэтому их и решать было интереснее, а я смог почувствовать себя гораздо полезнее, чем на Kaspersky Industrial.

В общем, в третий раз KrasCTF проводится и в третий же раз мы занимаем на нем первое место. Награждение и разбор перенесли на следующий день, поэтому мы вернулись в общагу, заказали еще две XXL пиццы с дополнительной по промокоду, немного поиграли в сетевые игры и легли спать.

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

Гвинт

25 сентября 2016

В третьем Ведьмаке была замечательная карточная мини-игра, называющаяся Гвинт. Она так понравилась публике, что разработчиков постоянно спрашивали, не собираются ли они выпустить эту игру отдельно. На последней Е3 они объявили, что действительно разрабатывают такую игру, и открыли запись на бета-тест, который пройдет 25-го октября.

Тем не менее, сейчас, примерно за месяц до бета-теста, они запустили другое событие — Kill the Servers, где предлагают поиграть в определенные дни и время, чтобы проверить инфраструктуру на стойкость.

На сайте игры нужно написать адрес своей электронной почты, пройти капчу и нажать на кнопку. В моем случае это повлекло появление GOG-окошка логина. А после логина в мою библиотеку была добавлена KtS-версия игры, которую я тут же начал скачивать.

Меню сделано неплохо, хотя интерфейс постоянно предлагает все возможные комбинации для совершения действий: кнопку Xbox-контроллера при входе, кнопку на клавиатуре, кнопку, на которую можно нажать мышью.

На время теста доступно две ненастраеваемые колоды — Королества Севера и Монстры. К слову, за вторую я так еще и не поиграл.

Я немного перепутал время теста, поэтому пытался войти в игру сразу после скачивания. Оказалось, что они открыли скачивание за день до самого события, а не в день события, как это иногда бывает.

На экране поиска соперника всегда показывается карта Цири. Хотя карт и нарисовано три, переключаться между ними нельзя, как, например, было сделано на экране загрузки Dragon Age: Inquisition.

В самой игре все поменялось: перерисован интерфейс, карты, но, что самое главное, изменилсь правила. Во-первых, в конце каждого раунда происходит добор карт. Если я правильно понял, две карты после первого и одна после второго. Во-вторых, кроме рядов — мечники, лучники, артиллерия — у карт еще есть статус: бронзовый, серебрянный, золотой. На самом деле, если приглядеться, то разница-то вроде небольшая, но первое время немного смущает. Золотые карты — это герои из оригинальной игры. Теперь, правда, есть возможность прокачивать карты до золотых (а их, как и раньше, не берут никакие эффекты). Кажется, также изменили управление — какое-то оно непривычное.

Бета-тест, если я правильно помню, будет на PC и Xbox, а сама игра также будет работать на PS4. А я почему-то думал, что игра будет доступна также на мобильных платформах. Ну, наверное, до них она тоже доберется.

27-го октября пройдет вторая волна KtS, и, наверное, я поиграю еще пару раз.

VolgaCTF 2016

17 сентября 2016

На этой неделе был в Самаре на VolgaCTF 2016. Наша команда имела некоторые трудности с оформлением поездки, поэтому часть команды не поехала вовсе, двое отправились на поезде, а трое (включая меня) — на самолете за свой счет, потому что ехать 40 часов в поезде не хотели.

В аэропорту Самары (и Тольятти) нас встретила волонтер нашей команды и вместе мы отправились прямиком в Holiday Inn, где в этом году проходили соревнования. В день, когда мы прилетели, там проводились лекции. Там же нас накормили бесплатным обедом. Когда наших товарищей встретили на вокзале и привезли в отель, мы все вместе отправились заселяться в профилакторий, где проживали участники соревнований.

Организаторы устроили «развлекательное мероприятие», на которое отправился я и еще двое участников из нашей команды. Из-за пробок мы немного опоздали на начало. Мероприятие состояло из ряда «станций», расположенных недалеко друг от друга, где волонтеры давали несложные задания командам и начисляли баллы. В общем, мы побегали, посочиняли стихи, пофотографировались и порисовали (правда, наши замечательные рисунки я не сфотографировал, а организаторы еще не выложили).

На следующий день тоже проводились лекции. На них мы решили не идти, а вместо этого хорошо выспались, покатались на метро и погуляли по набережной.

Вернувшись в профилакторий, мы заказали пиццу, и приступили к завершению нашей флагосдавалки.

Наконец, в день соревнований нас привезли в Holiday Inn на автобусе. В зале, где проводилась игра, нас встретил AC/DC — T.N.T. Во время игры играла ненапряжная электроника, будто сбежавшая с моего Яндекс.Радио — Dance with the Dead, например. В целом, было похоже на RuCTF, хотя зал и экраны со скорбордом, конечно, были не такие огромные.

Мы разместились за своим столиком, скачали образ системы и приступили. Первый час сеть была закрыта. К моменту, когда нам понадобилось написать эксплойт, оказалось, что в флагосдавалке есть пара ошибок, которые мы не могли найти до соревнования. Мы быстро их исправили и больше проблем со сдачей флагов у нас не было (если не считать дурацкого ограничения на число сдаваемых флагов, из-за которого приходилось иногда приостанавливать сдачу флагов).

Команда почти всю игру держалась в топе. В частности, мы были на первом месте с 100% по availability и defence. За час до конца скорборд заморозили, и тогда мы были на втором месте.

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

Нам вручили кубок, торт и каждому подарили по экшн-камере и селфи-палке.

После закрытия мы съели наш торт, а потом пошли по Самаре. Ребят, отправляющихся на поезде, повели дальше, а мы от них отделились и сходили в Папа Джонс. Оттуда нас забрал водитель и привез в аэропорт. Он, кстати, очень круто выглядит снаружи, но я сделал фотки только изнутри:

Собственно, на этом все.

1 2 3 4