Всем привет, я Никита Куртин, куратор Израильской высшей школы информационных технологий и безопасности.
ХакерУ .
И продолжаю рассказывать о кибертестах от ведущей израильской компании по информационной безопасности Checkpoint. В предыдущем почта Я описал, как я прошел четыре теста, и в этом хочу рассказать о следующих трех, которые мне удалось пройти.
Для тех, кто пропустил первый пост, расскажу этим летом Контрольно-пропускной пункт , опубликовал серию кибертестов.
Официально конкурс завершился к концу сентября 2018 года.
Задания были разделены на шесть категорий: • Логика • Интернет • Программирование • Сеть • Реверс • Сюрприз Две задачи по каждому направлению.
Как я уже написал , Checkpoint уже завоевал уважение и интерес с моей стороны, поэтому я решил взять на себя эти задачи.
Однако из-за плотного графика я мог позволить себе взять на себя только 8 задач из 12 (из четырех разных категорий).
И мне удалось решить 7 из них.
Так: Задача: «Головоломка».
Описание: Наконец-то мы нашли вас! Нам нужно сложить этот пазл, и как сказано в пророчестве, только вы способны на это.
Загадка довольно необычная.
Он состоит из доски с 10 столбцами и 10 строками.
Итого – 100 частей.
И каждый из них несет в себе загадку! Части состоят из четырех долей: верхней, нижней, правой и левой.
Каждый удар — это число.
Например:
Сверху – 12, справа – 3, снизу – 4 и слева – 5.
Чтобы головоломка была собрана, все части необходимо расположить на доске таким образом, чтобы каждая часть примыкала к равной части.
Кроме того, доля, которая ни к чему не примыкает, но является частью границы доски, должна иметь значение 0. Другие акции не могут иметь нулевое значение.
Вот реальный пример, состоящий из 4 частей:
В верхней части доски все доли, образующие границу, равны нулю.
Давайте посмотрим на верхнюю левую часть.
Его правая доля равна 9, а соседняя доля (левая доля верхней правой части) также равна 9. К сожалению, все наши данные перетасованы.
Они предоставляются в следующем формате: Идентификатор куба [доли]; идентификатор куба, [доли];… идентификатор куба, [доли] Где id куба — это числа от 0 до 99, а доли состоят из чисел, расположенных в порядке: верх, правый, нижний, левый.
Например, посмотрите на следующую перетасованную доску:
Вот как выглядит строка, описывающая эту плату:
Нам нужно, чтобы вы завершили головоломку!
Напишите нам строку, которая выглядит именно так:
Идентификатор куба, сколько раз его нужно повернуть по часовой стрелке; id куба, сколько раз его нужно повернуть по часовой стрелке;.
id куба, сколько раз его нужно повернуть по часовой стрелке
Строка с решением для этой платы будет выглядеть так:
Приведенная выше строка соответствует следующей (решенной) головоломке:
Давайте посмотрим на верхнюю левую часть.
В строке ему соответствует обозначение «2,2».
Как нам взять на вход кубик номер 2:
Но мы поворачиваем его по часовой стрелке дважды и получаем [0,19,5,0].
Теперь давайте посмотрим на верхнюю среднюю часть.
В строке ему соответствует обозначение «1,0».
Итак, берем из входных данных куб номер 1:
И не крутим его вообще (да, крутим 0 раз) - значит он уже в правильном положении.
Понятно?
А теперь помогите нам собрать пазл!
Это выглядит так:
Удачи!
Теоретически эту проблему можно решить разными способами.
Найдите свой и поделитесь им.
Я обдумывал несколько вариантов и в итоге пришел к следующим выводам: Первый.
В любой момент времени мне нужно определить только один куб.
Для каждого куба я всегда буду точно знать две стороны: верхнюю и левую.
Вначале это 0 и 0. У следующего кубика вверху также будет 0, а слева будет число, соответствующее номеру правой части предыдущего кубика.
Второй.
Из-за огромного количества различных вариаций между кубиками я должен постараться сделать как можно меньше шагов и избавиться от бессмысленной проверки при первом же отрицательном результате.
Третий.
Для работы с разными кубиками мне всегда нужно помнить их начальное положение (id), количество поворотов от начальной точки и, видимо, номера сторон (верхняя, правая, нижняя, левая).
Четвертое.
Исходный ввод представляет собой строку.
И выходные данные — это тоже строка (а не текущие позиции).
На основании всего этого я разработал для себя следующую стратегию: Двигайтесь линейно — слева направо, пока не дойдете до правого угла.
Далее идите вниз по линии и начните слева от нижнего номера куба, который расположен выше.
Соответствие необходимо проверять после каждого вращения.
Итак, если уже сделано 4 вращения и для данного кубика еще нет ни одного совпадения, я берусь за следующее.
Каждый проверяемый куб потенциально можно сверить со всеми остальными частями, для этого я могу рекурсивно повторить инициализацию каждого из них с полным набором всех остальных кубов.
Чтобы отслеживать все манипуляции с исходными данными, я выбрал метод объектно-ориентированного программирования, в котором куб — это объект, имеющий идентификатор, количество поворотов и четыре стороны: верхнюю, правую, нижнюю и левую.
Вместо того, чтобы копировать исходное состояние и избегать ложных подсчетов после нескольких вращений, я всегда увеличивал счет на единицу.
Но когда я проверял окончательное количество вращений, я использовал модуль (остаток от деления) на 4. Например, если нужен один поворот (от [1,2,3,4] до [4,1,2,3]), но сначала по ошибке были выполнены три поворота (на данный момент [2,3,4,1]) , в следующий раз вам понадобится 2 (от текущего [2,3,4,1] до необходимого [4,1,2,3]).
3 плюс 2 равно 5. И 5% 4 = 1, это то, что вам нужно.
Мне всегда нужно отслеживать используемые кубы и предотвращать повторные проверки.
Для этого я использую таблицу идентификаторов куба.
И если сравниваемый куб совпадает, я удаляю его из списка.
Я выбрал следующие структуры данных: HashMap — для связи идентификатора (начальной позиции) и куба, построенного из входной строки.
Стек – для проверки идентификаторов связанных кубов.
Массив – для временной проверки результата.
Код объекта куба:
Функции манипулирования стрингами:
Логика поиска совпадающих кубиков:
Результат:
Задача: «Пинг-понг».
Описание: Могу поспорить, ты недостаточно быстр, чтобы победить меня.
Вот где я:
нк 35.157.111.68 10158
Выполнив эту команду, вы получите:
На первый взгляд кажется, что это задача по работе с потоками.
Однако после получения первых данных создается впечатление, что он попадает в Timeout, а затем и вовсе выключается.
Когда данные закончатся, появится новый разделитель строк.
Я воссоздал поток, используя код Python. Кажется, это сработало, поэтому я добавил итерационный код, который повторял алгоритм пинг-понга и ждал появления флага.
После долгих пинг-понгов (возможно, более тысячи) между клиентом и сервером мне наконец удалось это сделать.
Задача: «Протокол»
Описание: Привет!
Нам нужно извлечь секретные данные со специального сервера.
Мы мало что об этом знаем, но нам удалось перехватить трафик, соединяющийся с этим сервером.
Мы также знаем, что путь к этому секретному файлу: /usr/PRivAtE.txt. Вы можете найти снифф-файл здесь (ссылка на файл).
Расскажите, пожалуйста, в чем секрет!
Удачи!
Я скачал файл и открыл его с помощью Wireshark.
И проверил зарегистрированные переговоры
Это позволило мне понять, что происходит
Я заметил, что между IP 35.157.111.68 на порту 20120 и портом 22 SSH есть связь.
Надо проверить этот порт 20120, решил я, а затем перейти к SSH (позже я понял, что в этом нет необходимости).
Я использовал команду nc, чтобы проверить этот IP-адрес и порт, и получил ответ: «0 8 Добро пожаловать».
Я не был уверен, какие данные он ожидает, поэтому вернулся в Wireshark, чтобы посмотреть, есть ли там еще какие-нибудь подсказки.
Я отфильтровал все пакеты данных для 35.157.111.68 на порту 20120 и нашел легко читаемый диалог:
Я воссоздал все это с помощью командной строки nc:
Я заметил, что ответ на мой запрос «2 3 XOR» отличался от того, что было в файле.
Я повторял всю процедуру снова и снова, чтобы увидеть, меняется ли каждый раз ответ.
Как я и думал, 4 полученных значения каждый раз были разными, как и конечные данные.
Похоже, что полученные четыре значения являются ключом к расшифровке итоговых данных.
Я также заметил, что числа перед каждым пакетом данных не случайны.
Это выглядит так.
Первая цифра означает порядок: 0 -> первый, 1 -> второй, 2 -> третий и т.д. Вторая цифра означает продолжительность фразы 8 -> «Добро пожаловать», 5 -> «Привет» -> и т.д. Я задавался вопросом, может ли это быть ключом к расшифровке.
Потому что конечные данные представляют собой непрерывную строку блоков из 4 HEX-значений, а ключ XOR также представляет собой 4 HEX-значения.
Возможно, я смогу перебрать каждый из них и разделить его на отдельные байты, а затем скопировать их с байтами из ключа.
И я попытался расшифровать:
Все получилось, но в полученных данных не было флага.
Перечитал правила и вспомнил, что путь к этому секретному файлу: /usr/PRivAtE.txt
Я повторил процедуру еще раз, но на этот раз запросил путь «/usr/PRivAtE.txt».
Я попробовал еще раз расшифровать окончательные данные:
И флаг был у меня в руках:
Вам удалось? Пишите свои идеи и варианты, буду рад комментариям.
Теги: #информационная безопасность #программирование #Образовательный процесс в ИТ #Логические игры #веб #учебный процесс ИТ #кибертесты #хакеру
-
Пифагор
19 Oct, 24 -
Опыт Верстки Для Pocket Pc На Примере
19 Oct, 24 -
Polymer 3.0 На Google I/O 2018
19 Oct, 24 -
Простая Игра Sfml
19 Oct, 24 -
Стрим: Новые Тарифы
19 Oct, 24