Как стать автором
Обновить

Разборы задач мини-CTF

Время на прочтение7 мин
Количество просмотров2.9K
Приветствую всех хабрачитателей. Прошло три недели с момента, как я предложил желающим порешать мой CTF и, думаю, что пора опубликовать разборы задач. По своему опыту знаю, что очень обидно быть в ситуации, когда потратил кучу времени на задачу, а решения так и не узнал, поэтому выкладываю разбор задач. Решения разбиты на шаги и скрыты под спойлер, чтобы после любого шага можно было попробовать дорешать задачу самому, преодолев сложный момент.

XT_CTF_01

XT_TASK_101

Шаг 1
Открываем архив и видим длинные имена папок. В последней папке лежат файлы, но без пароля их содержимое недоступно.

Выписываем имена папок:

5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
2346ad27d7568ba9896f1b7da6b5991251debdf2
e3cbba8883fe746c6e35783c9404b4bc0c7ee9eb
bef21e9bfcf9fab0a5aebd46a735efe5434da96b
86f7e437faa5a7fce15d1ddcb9eaeaea377667b8


Вбиваем последовательности в гугл и быстро узнаем, что это sha1 от слов:

password
hash
1000
letters
a


Соединяя все вместе, предполагаем, что пароль это хэш от 1000 букв ‘a’. Раз использовался sha1 для слов, то попробуем и тут – 291e9a6c66994949b57ba5e650361e98fc36b1ba. Извлекаем файлы, убеждаясь, что пароль подошел.

Шаг 2
Осмотр файлов показывает, что все они составлены по примерно общему принципу: имя формата xt + число, содержимое из пары строк, где первая несколько букв, а вторая – последовательность из шестнадцатеричных символов. Рассматривать шестнадцатиричные последовательности довольно неинтересно, поскольку в них по 79 символов (кроме файла xt121785230414240585522142219912, где их 58) – это точно не хэши и не что-то закодированное.

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

Вот, я укажу некоторые строки: he, li, n, o, ne, mg, si, ca, cu, zn, br, kr, ag…

Когда они рядом, то в них гораздо проще признать обозначения химических элементов. Открываем, таблицу Менделеева и собираем хекс-последовательность в один файл (всего файлов 53, именно такой номер у последней части с символом i, который соответствует Йоду, 53 элементу).

В результате получается PNG-файл с зеленым прямоугольником.

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



Шаг 4
Хэшируем sha1 все имена файлов и выстраиваем согласно порядку с предыдущего шага.

696e7400b8a8c7da1c52e63550ddfdf8ae03be73
206d6100f4eb7c768890e8502db2bdeb81718301
696e2800f1c5c0df7676667ffca16856e808f9dd
297b69008e0d05b67df33c751da3c6f17a3fdb9d
6e742000bf96cea16e609731aa7397ac2b9f7b15
613d3400d2fedbf43ad7c43d678382d2ef83dde8
36303900b909f396c69c6d47ccb623cc83d5e2ea
313132007f6fdde9d3abad5545f44b2d2661b0be
3b696e0002582f22cab7aeaf730680b87780279a
74206200267e505a621cf264e303d3df63222fa7
3d343600ac031f166103b5319a273a867d5247ae
36393700d9e521b0e0d488b47fde51e5f5f9650d
37323b00bdf3caa241b2936f0355ad89e420389c
696e7400a1f9f8e62cd64c8e25d852e433bda80c
20633d009932d3b69b7a74296c7b75894bcddbc1
373639000ca31548a80fe28adf263bbe89f03069
33393400f56920f247d4d66798bb2c54e3db668c
373b6900222283ee79a5e7e3e79d55d4b159ffb1
6e742000fac60ac1f78aa90201e98b30a9c4adbc
643d3700b55bc0dda8bd748983716018b29fbd6f
38323300176db95a8aa4aaf1770346c353fd4753
32313400644e234a3899bd84e9f7d61a12bfecab
3b696e00654b4b7d8fb3b022777c6346342eba91
742065009720d2693f833788e69a6641e8de22f6
3d363800b1e40956ec8ca6a64013c8a651eff0f7
3435340008b5419f5139553c85b605009e3fb343
38393b004e5d66b6980c7cf14dc9bf0acf09e444
696e7400e648ffad4cde46b4d845f1ffad075da5
20663d00b9bdab8cb8721581f5aa8a2c2522d9de
3334330054fb4abaf144e818ec1199b7b4ffec47
34353900378490c3ba53a356327af1bbb2d2c8b0
313b69008803024e711baf3695402d3a13e0c905
6e7420006434f491ab51a923995a3daf56a65f5e
673d3800c5198ae1565cc5744d23ac492f6d2506
3231380000217a2c380bf9c9a6e122b1c01e90ea
373339003ef4f423f0d9c54ea5d8fbe4d8bf518c
3b70720073caad02c9cba60debf81f72c0ac23ad
696e7400d9ddb857a7608947aae60ed6d054c039
6628220061a3a81dcc20ce43903a18cea28b77db
2573250065285f647ed3e22a9233974ac24509a1
73257300678138427cc07ee072c987583db2fc5e
25732500d183d5303ed6bda0606eb5e4ccc1e7c8
73257300c5e9d7bfdb76b5fee122fe57bc8aa81a
25735c003675c4f732d95ae6a0d9bcc6769f94ca
6e222c0088503423d1f56148bbf2573a6e2e0518
26612c007c8d1d6b90d252fa7b2084bd8695a8f9
26622c00ec96a4edbdeb286484af38395a3fc928
26632c004a1db36cdef743283e6bc853b6995555
26642c00dd66db502138413e272deb2da78d4f57
26652c00bb1785b4e41444da4230b602f1860557
26662c00e739c24f55c0899b8eae2a948622c7d7
26672900f4b4843d0056571d293bec879cd1968f
3b7d20006750ebb44ffd784dc8afdd5b0f76816a


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

Получаем такую строку:

int main(){int a=4609112;int b=4669772;int c=7693947;int d=7823214;int e=6845489;int f=3434591;int g=8218739;printf("%s%s%s%s%s%s%s\n",&a,&b,&c,&d,&e,&f,&g);}


Запускаем этот код на C, в результате получаем флаг. Сверяем хэш, чтобы лишний разу убедиться – да, это искомый флаг.

XT_TASK_102

Шаг 1
Открываем архив и сразу видим имена файлов в хексе. Содержимое файлов недоступно, поскольку требуется пароль. Начнем крутить имена.

Все имена одной длины, кроме файла с расширением 64F00000 (оно короче). Вообще расширения странные, нетипичные. Но довольно легко заметить, что у всех файлов разная длина расширений, причем она от 1 до 7. Имя с самым длинным расширением является самым коротким. Вполне логично предположить, что нужно соединить все хекс-последовательности, согласно длинам расширений файлов.

Сохраняем последовательность байт отдельно, понимая, что это 7z-архив, поскольку первые два байта (0x37 0x7a – 7z).

Шаг 2
Второй архив снова под паролем, но на этот раз у нас и имена файлов короткие и содержимое файлов небольшое. Хорошо, что просмотрщик архивов показывает метаданные файлов, а именно их контрольные суммы.

Несмотря на то, что crc гуглится довольно плохо, можно было все же проверить все последовательности и обнаружить, что по запросу crc 90c1667d, все же находится прообраз «four». Либо просто брутером перебрать трехбайтовые последовательности для самых коротких файлов. Любой из способов приводил к тому, что содержимое файлов легко устанавливалось – это были английские числительные «one», «two», «three», «four», «five» и «six». Вариантов, кроме как соединить имена файлов в таком порядке у нас нет. Получаем VVNFIENSQzMy. Проверяем в качестве пароля к первому архиву – подходит.

Шаг 3
Наблюдательные решатели, еще до пароля могли заметить, что crc32 от фалов архива имеет довольно специфичный вид, а именно 0xC0DExxxx. В CTF-ах таких совпадений не бывает.

Сами файлы представляют собой PNG-картинки с текстом. Поскольку на каждом шаге мы считали crc32, то стоит продолжить это делать. Проверив первый попавшийся текст с картинки (например qnGyaQBc), становится понятно, что мы на правильном пути, ведь crc32 – 0xc0de0831. Считаем crc от всего оставшегося и собираем в одну кучу.

CRC от картинок:
0xc0de094e
0xc0de054e
0xc0de0d7d
0xc0de0343
0xc0de0b52
0xc0de0734
0xc0de0154


CRC от текста:
0xc0de0831
0xc0de0430
0xc0de0c35
0xc0de027b
0xc0de0a33
0xc0de0654
0xc0de0058


Выкидываем общую часть, видим, что из значение первого байта из двух пробегает от 0x00 до 0x0d. Очень похоже, что это порядковый номер. Собираем, получаем флаг. Сверяем sha1 и дополнительно убеждаемся, что все верно.

XT_QUEST_103

list1
Дана последовательность чисел. Просто берем символы с указанными номерами из карты, ведя нумерацию с нуля и пропуская переносы строк. Имеет смысл заскриптовать данное действие – оно понадобится еще не раз.

Ответ: awEs0me_sTart

list2
Очень много цифр. Название файла подсказывает, что надо узнать количество цифр 5. Считаем количество не только пятерок, но и вообще всех цифр от 0 до 7. Получаем последовательность: 135, 95, 61, 27, 58, 57, 85, 190. Накладываем на карту, получаем ответ.

Ответ: b1g_sTEp

list3
Видим картинку с полиномом. Подставляем n от нуля до 9, как советуем имя файла, получаем последовательность, которая при наложении на карту дает ответ.

Ответ: coOl2math!

list4
Странное имя файла и странное содержимое. Если гуглить fdhvdu, то среди нерелевантных результатов можно найти указание, что это слово caesar закодированное шифром Цезаря – сдвиг на 3 символа по алфавиту. Раскодировав содержимое видим римские числа. Думаю понятно что делать с последовательностью чисел.

Ответ: dOinG_w3ll

list5
Содержимое таска буквально само говорит, что нужно сделать. Хэшируем файл, получаем 20 байт, которые можно трактовать как последовательность чисел для карты.

Ответ: exceLlenT_impECc4ble

visual1
Накладываем текст задачи на текст карты, причем «накладываем» в буквальном смысле.

Ответ: fa5t!One

visual2
В тексте задачи 840 нулей и единиц. Поскольку тема visual, то пробуем получить какое визуальное представление. Если текст разбить на 5 строк по 168 символов, то можно увидеть последовательность, которая ведет к ответу.



Ответ: go_fUrth6r


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

Ответ: heRoic_effOr7s

visual4
Нам дано шестнадцать шестнадцатеричных чисел в которых явно много битовых единиц. Переводим числа калькулятором и снова буквально «накладываем». Битовые нули отметят нужные символы. Символы читаем сверху вниз, слева-направо.

Ответ: ih8BiTs!

visual5
Название файла опять дает подсказку. «b3s23» – это обозначение конфигурации для игры жизнь. Берем какой-нибудь онлайн симулятор, вносим исходное расположение, ждем пять ходов и считываем количество живых клеток в рядах (что нужно делать именно так все еще подсказывает имя файла).

Ответ: jUsT_9ood

prog1
В тексте задачи видим что-то типа двумерной машины Тьюринга, которую просто нужно выполнить.

Ответ: k1l0_Byte

prog2
Задача явно предоставляет код на brainfuck, но если запустить на эмуляторе, то программа выведет сообщение, что задача не о brainfuck’е. Да, нужно всего-то посчитать количество символов в каждой строке и применить к карте.

Ответ: l1kEl1On!

prog3
Снова brainfuck, но в этот раз вывод с нами согласен. Искомая последовательность для карты лежит в памяти.

Ответ: moRe_1nfO2me

prog4
И тут brainfuck. Запускаем и программа выводит нам сообщение, что пароля нет. В памяти тоже ничего интересного. Придется разбираться в коде.

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

Убираем вторую строку, запускаем и получаем последовательность для карты.

Ответ: nO_baRr13rs

prog5
Последняя задача. Снова код на brainfuck’е. Видим указание, что нужно посчитать некоторую функцию от какой-то строки карты и код. Запускаем код, который в памяти оставляет подсказку, что искомая функция – это decode base64. Проверяем строки карты на предмет того, что будет если их раскодировать из base64. Внезапно, строка KysrWz4rPis8PC1d раскодируется в +++[>+>+<<-]. Запускаем код с этим дополнением и видим указание поксорить все символы в каждой из строк карты. Результат будет последним паролем.

Ответ: ofF1ci4l!suCceSs

Вот и все. Всем, кто участвовал – спасибо, если остались вопросы, задавайте их в комментариях.
Теги:
Хабы:
Всего голосов 12: ↑12 и ↓0+12
Комментарии0

Публикации

Истории

Работа

Ближайшие события