Рождественский конкурс Context 2018 - Запись

Наконец-то наступил декабрь! И что может быть лучше для празднования, чем старый добрый CTF? - contextis.com

Щелкните здесь, чтобы перейти на исходную веб-страницу.

Нам дается ключ к разгадке и шифр, который нужно расшифровать. Подсказка немного странная, имеет смысл начать с 1 + 1 = 2, 2 + 2 = 4, 4 + 4 = 8, но потом вы получите 8 + 8 = 7?

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

И те из вас, у кого есть зоркий глаз, могли заметить, что 8 + 8 = 16, а 1 + 6 = 7. Итак, наше лучшее предположение состоит в том, что, поскольку все шифры состоят из 1 цифры, мы можем предположить, что они являются выходными данными этой функции контрольной суммы. Следуя этой мысли, предположим, что входные данные этой функции находятся в диапазоне от 1 до 26 включительно (поскольку они могут соответствовать буквам алфавита).

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

Это сценарий, который я придумал, давайте пройдемся по нему и объясним, что делает каждая часть.

Здесь у меня есть shebang, импорт алфавита (для преобразования чисел в буквы) и шифр в виде списка целых чисел.

Это, так сказать, «мясо» кода, эта функция определяет, какие числа от 1 до 26, так что когда вы добавляете цифры числа, она дает любое указанное вами число, например: если вы передадите 4, он возвращает [4, 13, 22].

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

Вторая возможность состоит в том, что оно начинается с 1, поэтому сначала мы проверяем, является ли данное число 1 или больше, и если да, мы добавляем его к 10 и минус 1 (+9), поэтому 4 переходит в 13.

Затем мы применяем ту же логику, если оно начинается с 2, проверяя, равно ли оно 2 или больше, добавляя 20, удаляя 2 (+18), так что 4 переходит в 22. Однако это означает, что такое значение, как 9, может перейти на 27, но это вне допустимого диапазона (после z нет буквы!), поэтому мы ограничиваем значения x, проверяя, меньше ли они или равны 8.

Последняя возможность является частным случаем, так как если вы вставите 1 (без этих двух строк), функция вернет [1, 10]. Однако, если вы поставите контрольную сумму 19, вы получите 1 + 9 = 10, что не является 1 цифрой, поэтому нам нужно снова применить контрольную сумму 1 + 0 = 1. Это единственное исключение из предыдущих возможностей, так как это исключение, я просто проверяю, равно ли оно 1, и если да, добавляю 19 в список возможностей.

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

Затем мы распечатываем его, чтобы посмотреть.

Результатом будет этот вывод, и, прочитав его, вы можете заметить, что можете сформировать «merrychristmasyoufilthyanimal», выбрав нужные буквы из каждой группы букв.

Вот и все!

MERRYCHRISTMASYOUFILTHY животных