Следующая новость
Предыдущая новость

Карточный sokoban. Выигрываем в смарт-карты вместе с Clojure

30.11.2018 20:13
Карточный sokoban. Выигрываем в смарт-карты вместе с Clojure

Содержание статьи

  • Почему Clojure?
  • Рандомный посетитель
  • Сокобан
  • Готовим окружение
  • Пишем код
  • REPL driven development
  • Работа с картой
  • Реализация
  • Солвер
  • Заключительное слово

15–16 ноября в Москве прошла конференция OFFZONE Moscow, где участникам выдали пластиковые смарт-карты и предложили задания на получение флагов с их помощью. Для решения этих задач требовался картридер, который можно было арендовать или купить за внутреннюю валюту. На сайте мероприятия выложили задания и дали управляющие последовательности, с помощью которых можно выполнять функции апплетов, записанных на карту. Разберем задание по шагам.

Почему Clojure?

Для решения таска предлагалось взять Python-библиотеку pyscard. Но решать такого рода задачи гораздо продуктивнее, используя полноценный REPL driven development, с чем нам может помочь Clojure.

Рандомный посетитель

Началось все с того, что я узнал о возможности взять картридер и, используя некоторые APDU-команды протокола ISO/IEC 7816, выполнять задания с пластиковой смарт-карты, которая была выдана всем участникам вместе с бейджами. Это мне очень сильно напомнило PHDays V, когда я, как обычный посетитель конференции, просто подошел к стенду с электроподстанцией, поснифал пакеты через Wireshark, за ночь написал наивную имплементацию протокола IEC 61850 на Scapy, а на следующий день устроил с ноутбука DoS-атаку всему стенду SCADA (до плавки электропроводов я тогда, конечно же, не добрался).

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

В итоге во второй день на моей карте благодаря взятым флагам появилось 500 единиц внутренней валюты, что позволило мне уйти с конференции с толстовкой, картридером и еще некоторым мерчем, а также заопенсорсить библиотеку на Clojure, которую я написал в рамках конференции.

Сокобан

Самым красивым заданием (не считая финального с ботом для игры в танки, до которого я добрался, но не успел решить, ибо окирпичил свою карту на запись) с эстетической точки зрения был Vault Warehouse Management System (он же «Кладовщик», он же «Мудрый крот», он же «Сокобан»). Это псевдографическая игра, в которой нужно толкать условные коробки с провиантом таким образом, чтобы они встали на предназначенные для них в бункере-лабиринте места, и при этом не заблокировать эти самые коробки, случайно прижав их к стенам.

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

Гораздо веселее рассматривать это задание как игру. Для того чтобы выиграть в нее, я поставил своей целью подготовить окружение, написать код, запустить приложение и немного поиграть.

Готовим окружение

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

Сначала надо поставить и запустить PCSC Lite — демон и консольную утилиту для управления картой. Делается это как-то так:

sudo dnf install -y pcsc-lite pcsc-tools sudo service pcscd start 

Дополнительные зависимости при установленном Leiningen нам не понадобятся, но если ты собираешься воплотить что-то аналогичное на Python, то рекомендую не заморачиваться с установкой swig, redhat-rpm-config и прочего, а поставить pyscard из пакетного менеджера твоего дистрибутива:

sudo dnf install -y python2-pyscard python3-pyscard 

Отлично. Теперь вставим картридер в разъем USB и запустим утилиту для поиска активных смарт-карт:

pcsc_scan 

В случае успеха при вставке пластиковой смарт-карты с мероприятия ты увидишь что-то такое:

Карточный sokoban. Выигрываем в смарт-карты вместе с Clojure

Закрываем утилиту нажатием C-c и приступаем к написанию кода игры.

Продолжение доступно только подписчикам

Материалы из последних выпусков можно покупать отдельно только через два месяца после публикации. Чтобы продолжить чтение, необходимо купить подписку.

Подпишись на «Хакер» по выгодной цене!

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

1 год

4970 р.

Экономия 1400 рублей!

1 месяц

720 р.

25-30 статей в месяц

Уже подписан?

Источник

Последние новости