Просматривая открытые вакансии, в очередной я наткнулся на очень нетривиальную инструкцию к ответу:
Инструкции:
Для участия в собеседовании Вам необходимо решить эту “головоломку”.Она состоит из нескольких этапов, на каждом из которых вы будете получать очередной код + задание для следующего этапа — приложите эти коды в начале Вашего резюме при подаче заявки. К рассмотрению принимаются заявки только с наибольшим количеством пройденных этапов (обязательно решить несколько заданий!).
Задание “головоломки”:
QzBERTAxNzIwMDAwMjA3Mzc0NjU3MDYzNkY2NDY1M0EzMjMzMzkzNTJDMjA2ODc0NzQ3MDNBM
kYyRjY3NkY2RjJFNjc2QzJGNDc2RDQxNDgzMDY0
Я не совсем подходил под требования, но задание показалось слишком интересным, чтобы пройти мимо!
Первая мысль, которая проявляется при взгляде на закодированную строку – Base64.
Мнение, что это две строки, оказалось ошибочным – строка одна. Две получилось либо специально, чтобы запутать разгадывающих, либо случайно – внутренний редактор сайта подвёл.
Код необходимо декодировать:
1 |
echo base64_decode('QzBERTAxNzIwMDAwMjA3Mzc0NjU3MDYzNkY2NDY1M0EzMjMzMzkzNTJDMjA2ODc0NzQ3MDNBMkYyRjY3NkY2RjJFNjc2QzJGNDc2RDQxNDgzMDY0'); |
Получаем: C0DE017200002073746570636F64653A323339352C20687474703A2F2F676F6F2E676C2F476D41483064
Эту строку надо перевести в ASCII:
1 2 3 4 5 6 |
$str = base64_decode('QzBERTAxNzIwMDAwMjA3Mzc0NjU3MDYzNkY2NDY1M0EzMjMzMzkzNTJDMjA2ODc0NzQ3MDNBMkYyRjY3NkY2RjJFNjc2QzJGNDc2RDQxNDgzMDY0'); for ($z = 0; $z < strlen($str); $z+=2) { $mstr = substr($str, $z, 2); echo chr(hexdec($mstr)); } |
Получаем ÀÞr stepcode:2395, http://goo.gl/GmAH0d. В начале какие-то символы. Вероятно, при вставке закодированной строчки в текстовый редактор при публикации вакансии какие-то символы удалились. Ну или ещё что-то случилось.
Тем не менее, мы получили первый код (2395) и ссылку. При переходе по ссылке скачивается изображение 34 на 27 пикселей, на котором чёрные и белые пиксели в красной рамке. Так как это не похоже ни на QR-code, ни на бар-код, приходим к выводу, что это просто закодированная в изображение бинарная информация, где чёрная точка – 1, белая точка – 0.
Анализируем попиксельно изображение и переводим его в двоичный код. Полученный код переводим в шестнадцатиричный и способом, описанным выше, переводим в ACSII:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$img = imagecreatefrompng("picture.png"); $binstr = ''; $hexstr = ''; for ($b = 1; $b < 26; $b++) { for ($i = 1; $i < 33; $i++) { $color = imagecolorat($img, $i, $b); $binstr.=$color; } $hexstr.=dechex(bindec($binstr)); echo $binstr . '<br>'; $binstr = ''; } echo $hexstr . '<br>' . hex2str($hexstr); |
Получаем:
01010011011101000110010101110000
00100000010000110110111101100100
01100101001110100010000000110010
00111001001100010011000100110010
00101100001000000111000001101100
01100101011000010111001101100101
00100000011000110110111101101110
01110100011010010110111001110101
01100101001000000111011101101001
01110100011010000010000001110101
01110010011011000010000001110100
01101111001000000111010001101000
01101001011100110010000001101001
01101101011000010110011101100101
00100000011001100110100101101100
01100101001000000110001001111001
00100000011000010110010001100100
01101001011011100110011100100000
00100111001001100110001100111101
00110010001110010011000100110001
00110010001001110010000001110000
01100001011100100110000101101101
01100101011101000110010101110010
00100000011101000110111100100000
01101001011101000000000000000000
5374657020436f64653a2032393131322c20706c6561736520636f6e74696e756520776974682075726c20746f207468697320696d6167652066696c6520627920616464696e67202726633d32393131322720706172616d6574657220746f2069740000
Step Code: 29112, please continue with url to this image file by adding ‘&c=29112’ parameter to it
Таким образом мы получили второй код (29112) и следующее задание.
Если воспользоваться в браузере инструментами разработчика, то можно обнаружить, что сокращённая гуглом ссылка, которую мы получили ранее (http://goo.gl/GmAH0d) ведёт на http://delphir.com/picture.png?t=4133890800. По заданию, к этой ссылке и надо добавить тот самый параметр &c=29112. Получаем http://delphir.com/picture.png?t=4133890800&c=29112 . При переходе по ней, происходит редирект на страницу http://delphir.com/somescript.php с текстом “no access, try to solve this riddle! :)“.
Тут я вспомнил свою статью, которую писал пару лет назад. В ней описывался скрипт, который по разному реагировал на заголовки, пересылаемые ему браузером при обращении. Я подумал, что тут может быть что-то подобное. И ошибся. Всё оказалось намного проще – скрипт устанавливал cookie has_access = false. Так как Google Chrome не предоставляет возможность редактировать cookie, пришлось скачать стороннее расширение для браузера и изменить значение false на true. Обновляем страницу и скрипт редиректит нас на следующий адрес: http://delphir.com/somescript.php?user_id=1, при переходе на который мы видим текст:
Nice, you are in! :)
step code: 31001
Now try to break something there to reach the next step!
И вот мы получили следующий код (31001) и задание что-то сломать. Это задание оказалось проще всего – необходимо добавить, например, кавычку в адресную строку.
После этого скрипт выдаёт следующий текст:
Great!
step code: 40104
continue with this file
и предложение скачать очередное чёрно-белое изображение. И вот у нас есть следующий код (40104).
На этот раз изображение состоит из двух чёрно-белых блоков в красной рамочке. Просто перевести это способом, описанный ранее, не вышло – получилась чушь. Попробовал применить к картинкам операцию логического или (Дизъюнкция) – если наложить одно изображение на другое, то чёрный (а значит – 1) будет везде, где присутствует чёрная клетка, даже если она только на одном изображении. Сделал. Получилась чушь. Попробовал применить конъюнкцию – чёрный (а значит – 1) будет там, где на обеих картинках чёрная клетка. И опять получилась чушь. Следующей операцией, которую я решил попробовать, была сложение по модулю 2. Она оказалась той самой! :) Складываем, а дальше аналогично предыдущей расшифровке:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$img = imagecreatefrompng("puzzle.png"); $binstr = ''; $hexstr = ''; $img2 = 42; for ($b = 1; $b < 21; $b++) { for ($i = 1; $i < 33; $i++) { $color = imagecolorat($img, $i, $b); $color2 = imagecolorat($img, $i + $img2, $b); if ($color == $color2) { $ok = 0; } else { $ok = 1; } $binstr.=$ok; } $hexstr.=dechex(bindec($binstr)); echo $binstr . '<br>'; $binstr = ''; } echo $hexstr . '<br>' . hex2str($hexstr); |
Получаем:
01100001011100100110010100100000
01000100010011110100111001000101
00100001001000000100110001100001
01110011011101000010000001000011
01101111011001000110010100111010
00100000001101010011100000110010
00110000001101000010110000100000
01110000011011000110010101100001
01110011011001010010000001100101
01101101011000010110100101101100
00100000011101010111001100100000
01100001011101000010000001110000
01110101011110100111101001101100
01100101011000110110111101101101
01110000011011000110010101110100
01100101011001000100000001100100
01100101011011000111000001101000
01101001011100100010111001100011
01101111011011010000000000000000
596f752061726520444f4e4521204c61737420436f64653a2035383230342c20706c6561736520656d61696c2075732061742070757a7a6c65636f6d706c657465644064656c706869722e636f6d0000
You are DONE! Last Code: 58204, please email us at _____@______._____
Вот и всё. Получили последний код (58204).
После этого я отправил на указанную почту письмо со всеми кодами и меня попросили дать мой аккаунт skype, дабы связаться не следующий день.
Пока, кстати, так и не связались…
Для отправки комментария вам необходимо авторизоваться.