-
Notifications
You must be signed in to change notification settings - Fork 4
Управление роботом
- Категория: PPC
- Стоимость: 400
- Автор: Владимир Черепанов
- Репозиторий
...---... ...---... ...---... ...---...
Слышите это? Да, эти сигналы ни с чем не спутать. Наш маленький робот умеет общаться только при помощи азбуки Морзе, и на язык людей его сообщение переводится как SOS — старинный сигнал бедствия.
Этого робота мы нашли в одной из пещер неподалёку. Скорее всего, он использовался шахтерами для исследования горных пород, поэтому у робота нет камер и других оптических приборов. В шахтах они и не нужны, все равно робот бы ничего не увидел.
После того, как нам удалось наладить с ним связь, мы выяснили, что для ориентирования робот использует свой собственный корпус. Он по очереди двигается во все стороны, пока не встретит препятствие. Мы назвали это методом столкновений.
Прямо сейчас маленький робот застрял в каком-то лабиринте и не может оттуда выбраться. С помощью метода столкновений мы можем увидеть пространство вокруг робота, но только на один шаг.
Ему нужна ваша помощь. И внимательнее двигайтесь вдоль стен, вы же не хотите сломать робота об эти странные контуры?
Воспользуйтесь панелью управления.
- ссылка на сайт с панелью управления
Панель управления не может похвастаться богатым функционалом.
Мы можем только выбирать текущий уровень и перемещать робота в направлениях север-юг и запад-восток.
Если немного походить по уровням, можно заметить, что всегда в центре карты находится какой-то массив клеток, внутрь которого робот отказывается заходить, сообщая I can not go this direction!
. По периметру уровня также есть клетки, но при попытке войти в них мы видим уже другое сообщение: {"message": "Incorrect robot coordinates!"}
.
Похоже, кто-то общается с помощью формата JSON? Самое время взглянуть на исходники! К счастью, их тут всего два: html-страница, в которой нет ничего интересного, и robot.js - скрипт, описывающий поведение панели управления.
Взгляд сразу цепляется за две вещи.
- Первое - функция создания запроса к серверу:
var xhr = new XMLHttpRequest();
var url = 'resolve/';
var params = JSON.stringify({'level': level, 'x': x, 'y': y});
xhr.open('POST', url, true);
Данные методом POST отправляются на адрес /token/resolve/, а внутри самих данных лежит номер уровня и запрашиваемые координаты робота.
- Второе - словарь, описывающий направления:
{
'west': {'x': -1, 'y': 0},
'northwest': {'x': -1, 'y': -1},
'north': {'x': 0, 'y': -1},
'northeast': {'x': 1, 'y': -1},
'east': {'x': 1, 'y': 0},
'southeast': {'x': 1, 'y': 1},
'south': {'x': 0, 'y': 1},
'southwest': {'x': -1, 'y': 1}
}
Эти направления и использует сервер, когда возвращает информацию о соседних с роботом клетках.
Чтобы убедиться, повторим запрос сами с помощью Python 3 и модуля requests:
>>> import requests
>>> url = 'https://blind-robot.contest.qctf.ru/3f660459ac7dc78e92744087d9379479/resolve/'
>>> requests.post(url, json={'level': 0, 'x': 0, 'y': 0}).text
'{"moves": {"west": false, "southeast": true, "east": true, "north": false, "northeast": false, "southwest": false, "northwest": false, "south": true}, "type": "empty"}'
Да, это JSON. В type лежит состояние запрошенной клетки, а в словаре moves - состояние соседних. В описании есть намёк на странные контуры, да сами стены очень напоминают какие-то символы, поэтому пора приступать к автоматизации решения.
Сначала пройдёмся по всем уровням и заметим, что всего уровней 58, а размеры каждого уровня не превышают 17x26. Кроме этого, сервер возвращает нам информацию не об одной клетке, а о целых девяти сразу! Это позволяет нам сократить количество запросов в 9 раз. И не стоит забывать о асинхронности, сервер же не требует от нас хоть сколько-то последовательных запросов.
Полный текст эксплоита доступен в репозитории, я же расскажу про основные моменты:
- Python 3.6! На нём эксплоит работает быстрее всего (около 10 секунд)
- для асинхронных запросов используются современные возможности языка - asyncio и aiohttp
- скачивается только 1/9 поля, используется словарь направлений из robot.js
- картинка рисуется с помощью PIL