23 октября 2014

D-CTF 2014 - MISC 300

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

Название задания: LooL
Описание задания: отсутствует
Ход решения:



В самом задании была дана картинка и отсутствовало какое-либо пояснение. Из картинки, а также названия таска следует, что речь идет об игре league of legends. Первое что пришло в голову - поискать саму картинку в интернете, а потом посмотреть какая информация есть на представленных сайтах. Минут 10, потраченные на первоначальный поиск убедили в несостоятельности подхода и таск был оставлен до лучших времен.
Спустя пару часов безуспешных попыток решить другие задания в этом "...бесконечном GuessCTF..." узнал от товарищей, что попытки найти этот определенный матч и составить подходящую комбинацию из любых слов, относящихся к нему результата не дали.
Второй и на мой взгляд самой здравой идеей была инспекция самой картинки. Спустя минуту был найден оригинал, и побайтовое сравнение не выявило разницы. Вывод - стеганография не используется. Суммируя всю полученную информацию было принято решение проинспектировать исходный код страницы, на которой  висело задание. Это было правильно, поскольку в комментариях помещалась строка base64.






iVBORw0KGgoAAAANSUhEUgAAABwAAAAUCAIAAAARPMquAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3goNFiAI385k0QAAAPVJREFUOMuNVEESxCAIC47/Nr6cPahbpUDtCRWTEDMVKNxPAQhEoQJRAE9h6tdSCzpdUPkXaguDOI5UnmUZTT7uEuju7zLNZomaIoh327uhRAKTCRK9Iah7LScwzdWcMbjcgyMSBBoP9JoAmcugQsVIbl52DqUtBm0cuV1yFocrqE4VMa3/9ETfODylnNmVdmVFPhmn0phz9un5zIuZgOaeZobKjikDd5jWo/GHEJ4qEKgYPoFH2nylC+qju104Oz010euxD921WxSUfayaMAu3q4vZxIPLjW7G7/H7Lmc/4mHmqB6/72y7iy23H7wSt7nPxxLVH88jbs4UmdXpAAABlmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSfvu78nIGlkPSdXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQnPz4KPHg6eG1wbWV0YSB4bWxuczp4PSdhZG9iZTpuczptZXRhLycgeDp4bXB0az0nSW1hZ2U6OkV4aWZUb29sIDkuNDYnPgo8cmRmOlJERiB4bWxuczpyZGY9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMnPgoKIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PScnCiAgeG1sbnM6ZGM9J2h0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvJz4KICA8ZGM6ZGN0Zj42ZmI1MzI5NWI1MzVlYmRmZmExYWM4ODQzZmM2YWNkZDwvZGM6ZGN0Zj4KIDwvcmRmOkRlc2NyaXB0aW9uPgo8L3JkZjpSREY+CjwveDp4bXBtZXRhPgo8P3hwYWNrZXQgZW5kPSdyJz8+KPPlkwAAAABJRU5ErkJggg==
Расшифровка дала исходный код картинки, и признаюсь сначала поставила в тупик, так как я забыл, что онлайн декодеры имеют некоторые проблемы. А именно не все непечатаемые символы удалось скопировать из браузера в файл, поэтому картинка не открывалась, а восстановление её не представлялось возможным. Но кроме существенной задержки в получении ответа, данный шаг принес и положительные плоды: копаясь в полученной картинке в одном из тегов метаданных помещалась строка md5.
<dc:dctf>6fb53295b535ebdffa1ac8843fc6acdd</dc:dctf>
Естественно что данный хеш сразу был отправлен в качестве флага, поэтому вызвал сильное недоумение, когда не был  принят проверяющей системой. На данном этапе решение остановилось ещё на час. Не оставалось ничего адекватного кроме как загуглить md5 и увидеть, что такой действительно есть и расшифровывается он как brainloller. В свою очередь Brainloller был отправлен как флаг, и тоже не верно. Потом стало ясно что этот язык является графической формой языка Brainfuck, и очевидно картинка, в которой нашли md5 это программа на данном языке.
Картинка увеличена примерно в 10 раз 
После таких умозаключений с помощью Python 2.7 картинка корректно была извлечена из base64. Поиск интерпретатора, показал что в легком доступе есть только на Python и на PHP. Не имея интерпретатора второго языка, я использовал программу на первом и потратил более 3 часов стараясь заставить её работать. К сожалению все мои усилия были тщетны. Возникло желание быстро написать собственный интерпретатор, но и тут я столкнулся с ошибкой, которую не смог решить быстро - PIL отказывался работать. Потеряв достаточное количество нервных клеток я просто вручную перевел программу на Brainfuck и попробовал исполнить в нескольких онлайн-интерпретаторах. И вот тут была моя главная ошибка!


++++++++[>+>++>+++>++++>+++++++++++>+++++++>++++++>++>+++++++++>++++++++++>+++++++++>++++++++++++>+++++++++++++++>++++++++++++++>++++++++++++++>+++++++++++++++++<<<<<<<<<<<<<<<<-]>>>><<<<<<<<<<<<-.+>>>>>>>>>>><<<>>>>>>>>>>>>>>-.+<<<<<<--->>>>>>>>>>>>>>><<<<<<<<.+++<<<<<<<<<<<<<<<>>>>>>><<<<<<<<<<<++++.---->>>>>><<>>>>>>>>>>>>>+.-<<<<<<<<+++.---->>>>>>>>>>>>><<<<<+<<<<<<<<<<<<<>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<+.->>>>>>>>>>>---.+++<<<<<<<<<<<<++++.---->>>>>>>>>>>>>><<<<<<<<<<<<<<<>>>>>>>>>>>>>.<<<<<<<<<<<<<<++++.---->
Я был на 100% уверен что флагом является результат выполнения программы, поэтому когда она выдавала мне полнейший бред я злился и пытался отладить код, перепроверял и переперепроверял. Каких только комбинация я не испробовал, но ничего не подходило. Таск вновь был отложен. На утро другого дня, ближе к концу соревнования, я безнадеждно продолжал искать ошибку, но натолкнулся на пример программы на Brainfuck написанной на Brainloller. Стал проверять и нашел: код читается в нечетных строках слева на право, а в четных наоборот - справа налево. Переделав то, что у меня было я получил результат.
++++++++[>+>++>+++>++++>+++++>++++++>+++++++>++++++++>+++++++++>++++++++++>+++++++++++>++++++++++++>+++++++++++++>++++++++++++++>+++++++++++++++>++++++++++++++++<<<<<<<<<<<<<<<<-]>>>>>>>>>>>>>>>+.-<<<<<<<<<<<<<<<>>>>>>>>>>>>>>-.+<<<<<<<<<<<<<<>>>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<<<>>>>>>>>>>>>>----.++++<<<<<<<<<<<<<>>>>>>>>>>>>>+.-<<<<<<<<<<<<<>>>>>>>>>>>>>----.++++<<<<<<<<<<<<<>>>>>>>>>>>>>>>-.+<<<<<<<<<<<<<<<>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<>>>>>>>>>>>>>>----.++++<<<<<<<<<<<<<<>>>>>>>>>>>>>>----.++++<<<<<<<<<<<<<<.
Осталось только исполнить получившийся код и получить свой флаг.
flag: youdidwell
//solved by gek0n