Dmitry Astapov (_adept_) wrote,
Dmitry Astapov
_adept_

Category:

Новогодний квест 2011 - подведем итоги

Надо поторопится и пока не закончился этот год выложить правильные ответы на новогодний квест.

Начнем со статистики

Сколько же человек прошло каждый уровень?


Что-то я не понял, как в Google Charts надписать количества над графиком, поэтому вот то же самое сухим языком цифр:
Уровень Прошедших
0 rot13 77
1 base 34
2 nextplease 14
3 spaces 10
4 banner 7
5 sms 6
6 barcode 8


Несколько лидеров так спешили, что не "отметились" на паре последних уровней, что объясняет несколько странные цифры в последних трех строчках.

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

Кто же эти гиганты мысли?


Время финиша Ник
12/29/2010 5:16:35 alt
12/29/2010 11:22:28 SL
12/29/2010 23:43:25 Talka
12/30/2010 0:05:50 Void
12/30/2010 1:23:47 dss
12/30/2010 11:27:08 folone
1/1/2011 23:44:51 avk
1/3/2011 13:56:02 _winnie

Обратите внимание, что между третьим и четвертым местом разрыв менее чем в 20 минут!

Полная статистика находится тут.

Поздравляю всех победителей! У меня для вас нету призов, даже утешительных, но я надеюсь, что для вас достаточным вознаграждением было удовольствие от процесса прохождения.

А теперь - правильные ответы.

Уровень 0

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

Похоже, что с этой подсказкой я сильно пролетел, и она всех сильно запутала :(

Уровень 1

Надпись на картинке навеяна мемом "I'm in ur base slaying ur dudes" (первоисточник). Надпись помещена на картинку в качестве подсказки, т.к. в ней есть слово "base".
В метаданных картинки, в поле для комментариев, находится пароль к следующему уровню в base64. Комментарии можно увидеть в каждой второй утилите для просмотра картинок, в хекс-редакторе, с помощью утилит для работы с EXIF.

Уровень 2

Картинка представляет собой "запись" последовательности 4 -> 14 -> 1114 -> 3114 -> ...
Способ записи простой: картинка состоит из 4 пикселей одного цвета, 14 - другого, 1114 - третьего.
Следующий элемент последовательности - 132114, так как на каждом шаге мы считаем идущие подряд одинаковые цифры и выписываем их количество: "одна тройка, две единицы, одна четверка" (вот еще один пример, более известный).

Уровень 3

Между строками текста находятся строки, состоящие из одних пробелов. Надо посчитать число пробелов во всех пустых строках, получится 3141592. Перечитайте задание - фразы в нем намекают или на пробелы, или на что-то круглое, или явно на число "пи" :)

Уровень 4

Слово-пароль было пропущенно через утилиту "printerbanner". В результате получается вот такая ASCII-шная красота (показаны только несколько первых символов):
                              ####                                                                                   #### 
                              ####                                                                                   #### 
                              ########################################################################################### 
                              ########################################################################################### 
                              ########################################################################################### 
                              ########################################################################################### 
                              ########################################################################################### 
                              ########################################################################################### 
                              ########################################################################################### 
                              ########################################################################################### 
                              ####                                      ##### 
                              ####                                        ##### 
                                                                           ##### 
                                                                            ##### 
                                                                            ###### 
                                                                             ###### 
                                                                             ###### 
                                                                             ####### 
                                                                             ####### 
                                                                            ######## 
                              ####                                         ######### 
                              ####                                      ############ 
                              ###################################################### 
                              ##################################################### 
                              ##################################################### 
                              #################################################### 
                              ################################################### 
                              ################################################# 
                              ############################################## 
                              ########################################## 
                              #### 
                              #### 
                                   
                                              ###################### 
                                          ############################## 
                                       #################################### 
                                     ######################################## 
                                   ############################################ 
                                  ############################################## 
                                 ################################################ 
                                ###############                    ############### 
                               ###########                              ########### 
                               ########                                    ######## 
                              #######                                        ####### 
                              ######                                          ###### 
                              #####                                            ##### 
                              #####                                            ##### 
                              #####                                            ##### 
                               ####                                            #### 
                               #####                                          ##### 
                                #####                                        ##### 
                                 #####                                      ##### 
                                   #####                                  ##### 
                                     #####                              ##### 
 ################################################################################### 
 ################################################################################### 
 ################################################################################### 
 ################################################################################### 
 ################################################################################### 
 ################################################################################### 
 ################################################################################### 
 ################################################################################### 
 ###                                                                            #### 
 ###                                                                            #### 

Далее каждая строка упакована RLE. Так как используется всего два символа (пробел и #), то RLE, по сути, будет подсчитывать длины подстрок, состоящих из одинаковых символов. В результате каждую строку можно записать как набор чисел (длина подстроки 1, длина подстроки 2, ..., длина подстроки N). Вся картинка, таким образом, будет списком списков чисел.

Но так как в картинке есть много одинаковых повторяющихся подряд строк, можно применить RLE к списку строк. Получим список пар вида: (кол-во повторений строки, сжатая строка).

В качестве подсказки файл с заданием называется "banner" или "image" (по-датски). Почему по-датски? А просто так :)

Уровень 5

Задание иносказательно говорит о технологии быстрого набора T9 в телефонах. Идея задания появилась у меня еще до того, как телефоны с тачскринами получили широкое распространение, но текст я менять не стал.

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

Например,  3^2*7*19*1987 = 2378439. Если набирать эти цифры с t9, то получится слово "certify".
Без t9 это будет, соответственно, 31*151*523*6827*13302799 = 222337778444333999.

Уровень 6

Для подготовки этого задания я взял 100 примерно одинаковых строк вот такого вида:
1/100. NEXT IS 1QYX1GBHNWQVEAT
2/100. NEXT IS 65KBSMF3YHCQD20
3/100. NEXT IS 4YHOWO8U3SB53IF
...
98/100. NEXT IS CP7EDNIFHQIQKAF
99/100. NEXT IS KFWBQKXUVX0AAIR
100/100. CODE IS RZHQ2BRFE9AM0YT

Каждая строка была превращена в штрих-код Code39. Задание содержало URL картинки с первым штрихкодом. Декодировав его, можно было получить URL картинки со вторым штрихкодом, и так до последнего, сотого штрихкода.

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

Исходники

Я выложил все "приборы и материалы", использованные для создания квеста, сюда.

Отчеты победителей (анонимизированные)

Раз
По заданиям: 
level0: Название файла с подсказкой уже вызвало мысль про rot13. Дальше google -> rot13 online 

level1: Хорошо, что просмотрщик умеет JPEG-комментарии и exif. Не увидев ничего содержательного на картинке, полез в атрибуты. Косяк был, что в первый раз по ошибке забыл ключик -d у base64 :) 

level2: Первая мысл при взгляде на картинку - спираль простых чисел (встречались там похожие фрагменты). Но так как не понятно, что с ними делать дальше - идею отложил. Посмотрел поканально гистограмму - в свете фразы про "они увеличиваются", подумал про значения каналов. Вспоминания питона -> download PIL и чтение доки из него - интересная ф-ция getcolors() и интересное наблюдение за последовательностью количеств пикселов. Саму последовательность где-то видел, поэтому достроил следующий член, возвел в куб - не подошло. Откатился на последний член последовательности из картинки. bingo и баг-репорт в комментариях 

level3: Добавление UNICODE BOM виндовым блокнотом сбило все четные строки. Поэтому сначала считал по восклицательным знакам. Какой случайностью наткнулся на пробелы, уже не помню. 

level4: Текст задания сильно напомнил вывод питонового скрипта из level2 :) Не поленился - руками переформатировал массив по одному элементу (кортежу) на строку. Зацепился взглядом, что массивы во вторых элементах кортежа имеют небольшую нечетную длину и часто суммы этих массивов равны. Ага, скорее всего картинка. И скорее всего первый член кортежа - количество колонок, описываемых вторым членом. Такой вот RLE :) Дальше дело техники - PIL, отзеркаленная по вертикали :) картинка с некорректными цветами (PIL по умолчанию заливает новую картинку черным, а строить я начинал с белого цвета), level up 

level5: Задание, с которым промучился дольше всего. Вначале была мысль про переполнения в целочисленной арифметике, но вывод чисел ничего очевидного не показал. Потом попробовал тупо на длинных числах посчитать, что же предлагается. Получил число. Для слова пробовал различные варианты, связанные с удалением дублей либо подавлением дребезга, с разными вариантами написания ( correction deduplicate correct Correction fix compress Compression compression disposal removal receding reduce reduction ). Пришлось искать словарь слов английского языка и запускать bat-файл, который добавляя слово к числу, пытался полученную строку подсунуть в качестве пароля. Из-за небольшой ошибки в скрипте, цикл не прерывался и после нахождения пароля. Но к утру в консольной сессии висела правильная строка. Слово validation оказалось на позиции 64270 из 144400. Повезло, что и в словаре и в пароле совпал регистр символов. Хотя до сих пор мне не понятна связь между валидацией и удалением дубликатов. 

level6: google -> Online barcode decoder. скачал картинку, подсунул, скачал следущую. Осознание написанного и ощущение "Влом" пришло на примерно 6/100. google -> Python barcode decoder -> cсылка на zbar. Цикл "скачать - декодировать - разобрать - выдрать имя следущего файла", пока разобранная строка попадает под регулярку '^(\d+)/(\d+)\. NEXT IS (\w+)$'. На всякий случай прерывание цикла на совпадении чисел (ну мало ли косяк, в первых картинках 1/100, 2/100, а ближе к концу появится 98/98) 

По ощущениям от статистики, в level5 не один я брутфорсил :) 

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

Два

level0:
При чем тут рота я додумался уже после прохождения всего квеста, а о способе догадался еще по названию файла с задачей. Быстренько сделал rot10 и обломался (8
Мог бы потерять кучу времени, но на всякий случай сделал rot1—rot26 и в выводе увидел ответ напротив стандартного rot13.

level1:
Когда-то я проходил много таких квестов, поэтому имею привычку все картинки пихать в identify -verbose. Тонкую игру слов про BASE оценил, но кодировку спалил по внешнему виду и знаку «=» в конце.

level2:
Тот же самый identify выдает гистограмму по цветам. Число точек заинтересовало явной неслучайностью, но продолжив серию по образцу, напаролся на «Corrupt file or wrong password» и расстроился, потому что идея была слишком уж хороша. Потом, правда, выяснилось, что в квесте ошибка. Свежий архив распаковался.

level3:
Я по долгу службы ковыряюсь в питоне, поэтому в виме настроена подсветка leading и trailing whitespaces. Все стало понятно сразу после открытия файла с заданием.

level4:
Самый сложный уровень. Отнял почти 3 часа упорных размышлений, с перерывом в день. Крутил этот массив по-всякому, но зациклился на элементах со списком из 1 числа, которых оказалось ровно 20. Вероятно сам бы я его так и не решил, но товарищ, уже решивший весь квест, сжалился и дал только одну подсказку: «/usr/bin/banner»
После чего все тоже стало понятно, и после 10 минут ковыряний ответ был найден, но я признаю, что квест таки слил. Потому что без этой подсказки вряд ли бы когда догадался… Кстати, очень сильно помогло бы, если бы последняя цифра была не 1. Если бы ширина была одинакова по всему массиву, это повысило бы шансы на успех.

level5:
Не знаю как, но догадался сразу. Хоть в условии и была ошибка (41*177553 совсем не то же самое, что 7^3*2121801101448011, ну или у меня T9 кривой), но с первого же получившегося слова сомнений уже не было.

level6:
Увидев, что следующий код очень похож на имя текущего файла, попробовал открыть следующий. Он открылся, и задачу можно было бы считать решенной. Но качать 99 картинок руками было очень лениво, поэтому начал искать библиотечку для дешифровки кодов. Ничего путного быстро не нагуглилось (попался какой-то zbar, но он у меня не собрался), поэтому накостылил из curl и grep интерфейс к http://www.onlinebarcodereader.com/, который и принес мне ответ через 7 минут работы. Костылить его пришлось 40 минут, потому что сервис довольно нетривиальный и очень долго ничего вообще не декодировалось.

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

Три

0. caesar — Подбор
1. debased-RVUcjg9VEJ7ngxNw45B5 — Банально
2. 1379203759905415960730017544 — Заметил странность гистограммы в фотошопе при изучении
3. 31006257328285746688 — В текстовом редакторе была включена визуализация пробелов
4. hqLK5QlQuzF9edflFTVw — Как-то додумался. Правда сначала думал, что в квадратных скобках идут номер позиции - количество символов, но потом посмотрел на «перекрывающиеся» при таком предположении группы типа [38,2,23,25,1], и добил-таки.
5. 82543283validate — Довольно быстро пришла аналогия с мобильником
6. RZHQ2BRFE9AM0YT — Пропробовал картинку в программе bcTester — показала отлично, но 1/100 и невозможность работы с этой программой через командную строку заставили сникнуть. Поиск консольной утилиты для написания скрипта «скачка-распознавание-скачка» ничем не увенчался — попробовал две, обе никак не находили в файле баркода. Пришлось писать всё самому по статье в википедии о Code39 на C#.

Четыре

0. Брутфорс john the ripper'ом.

1. Это было проще всего, наверное.

2. Гимпом смотрел гистограмму. Правда, сознаюсь, вначале брутфорсил.

3. Заметил лишние пробелы когда начал бегать курсором туда-обратно.

4. Самое сложное задание. Очень долго курил, пока не появилась идея, что же должно получиться в результате.

5. Считал-считал, потом пошёл на митинг, от скуки начал клацать телефон сотрудника (с Т9), и ЭВРИКА.

6. Ну, на 3/100 понял, что руками я этого делать не буду. Набросал скриптик на скале. Библиотекой юзал ZXing (http://code.google.com/p/zxing/).

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

Пять

Первые 2 уровня дались сложнее всего.

level0: Подсказка так и осталась непонятой:-) Задание далось после того, как перестала обращать на нее внимание, и заглянула в прошлогодний квест для настройки на нужную волну. Затем быстрый перебор кодировок/сдвигов дал результат.

level1: Сломала об него голову:-) А все потому что при беглом изучении каринки коммент остался незамеченным. Что только не делала с указанными мемами!:-) Когда нашелся конструктор и в нем удалось создать такую же, вернулась к изучению свойств картинки. Кодировка благодаря подсказкам из мемов, нашлась быстро.

level2: На красные точки медитировала недолго. Гистограмма у меня в фотоменеджере отображается постоянно, - быстро была замечена ее специфическая форма. 

level3: А здесь помогли всегда отображаемые невидимые символы в ворде.
Хотя вначале была попытка поработать со списком слов, которые были изменены в оригинальных фразах. 

level4: Было замечено колличество элементов с одним числом в скобках в колличестве аккурат 20 штук - выглядели как замыкающие элементы блока. Кроме того, они в большинстве случаев являлись суммой чисел из предыдущей записи. Также было замечено незначительное изменения в абсолютных значениях от элемента к элементу в пределах блока (напр., 0, -1, +1) и постоянно нечетное колличество чисел в скобках. Было предположение, что это ходы игры - ничего конкретного не сформулировалось. Попробовала представить это в виде рисунка - несколько неверных интерпретаций, а затем вдруг понимание и нечетного коллиства цифр, и начальных значения элементов (1/2/4/9/16). На поиск принципа ушло минут 20, а вот на создание рисунка вручную, к сожалению, безумно много времени.

level5: Решился очень быстро. Tелефон и Т9 - одно из самых первых интуитивных предположений. Но вместо того, чтобы сразу искать, почему это может быть Т9, пошла искать другие идеи. Перемножила числа только после проверки их на простоту - когда убедилась, что это разложения на множители, и что числа - это числа(!):-) Увидев результат, вспомнила про начальную мысль о Т9:-)

level6: Тоже начала искать решение издалека - не верилось, что все так просто:-) Где же видано, чтобы штрих-код был и вправду штрихкодом (!):-)- все преобразовывалось в нули/единицы/слова. Куча подходов в попытках превратить штрих-код в код Морзе, двоичные последовательности и т.п. Затем сдалась - поверила, что это просто штрих-код:-) 1/100 настораживало:-) Немного подуплив над двумя последовательными 15-символьными строками (из названия и из кода), нашла следующий штрих код:-) Начальные символы 2/100 опасения подтвердили.. Дешифратор нашелся не очень быстро, и не бесплатный:-) А в траяльном режиме пришлось 100 раз выполнять "сохранить-открыть-преобразовать-набрать код ручками (даже копировать не удавалось). 

Это и было то единственное, что деморализировало - слишком долгий (в сумме до 4-5 часов) и неинтересный процесс извлечения уже собственно кода из уровней 4 и 6, а также осознание, насколько проще это можно было бы сделать программно (но оценка времени на установить+вспомнить как это - кодировать, была также неутешительна). Можно было сделать либо код/процесс доступа к нему короче либо предупредить о значительном преимуществе для программеров - тогда проще было бы сразу не начинать:-)
А в общем, квест очень порадовал, и был прекрасной мозговой разминкой:-)
Tags: quests
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 7 comments