X-PuzzleИван Скляров (xpuzzle@real.xakep.ru, www.sklyaroff.ru) «ПРОЙДИСЬ ДЕБАГГЕРОМ ПО МОЗГАМ!»Не стесняйся присылать свои ответы, даже если смог ответить всего на один пазл. Я с интересом почитаю оригинальные варианты решений. Ну, а герои, которые первыми правильно ответят на все вопросы, получат призы и увидят свои имена на страницах ][. Помни: в большинстве случаев вариант ответа засчитывается как правильный, только если к нему приложено подробное и ВЕРНОЕ объяснение. Победитель, занявший первое место, получает также книгу от ведущего рубрики: Ответ на пазл №1 «НЮХАЧИ НА ПРОВОДЕ»Чтобы дать ответ на эту задачу, нужно знать, как работают коммуникационные устройства, показанные на рисунке. Репитор и хаб передают данные, пришедшие с одного порта, на все остальные свои порты, совершенно не интересуясь, что это за данные и кому они предназначены. Мосты и свитчи избирательно относятся к данным, просматривают заголовки кадров и пересылают их из одного сегмента сети в другой только в том случае, если адрес назначения (MAC-адрес) принадлежит другому сегменту. Маршрутизаторы еще сильнее изолируют подсети друг от друга и передают данные из одной подсети в другую, основываясь на информации, хранящейся в IP-заголовках. Таким что, единственный компьютер, с которого можно обмениваться данными с компьютером «А» в указанной сети, не опасаясь, что трафик будет прослушан одним из сниферов, это компьютер под номером 7. Ответ на пазл №2 «ОТДАЙ ПАРОЛЬ»Правильный пароль: «FFORAYLKS» (записанное наоборот «SKLYAROFF»). Исходный код программы PASSWORD.COM на ассемблере с комментариями можно найти на диске к журналу. В качестве пояснения скажу, что над каждым символом введенной строки выполняется операция XOR на соответствующие ASCII-коды символов строки «password». К каждому полученному коду затем прибавляется еще и значение 99h. Кроме этого, содержащиеся в программе девять ASCII-кодов слова «standard» складываются с кодами начала программы (начиная с метки Start). Полученные две строки сравниваются, и если они равны, на экран выводится «OK!». Ответ на пазл №3 «ЗАКОДИРОВАННАЯ ФРАЗА»Фраза набрана на русском языке, но в греческой раскладке клавиатуры. Если нажимать те же клавиши в русской раскладке, то фраза будет выглядеть так: «ГРЕЧЕСКАЯ РАСКЛАДКА КЛАВИАТУРЫ». Все существующие раскладки клавиатур можно увидеть на сайте Microsoft по адресу: www.microsoft.com/globaldev/reference/keyboards.mspx. Ответ на пазл №4 «БАГАБАГА»Программа «bagabaga» упакована с помощью UPX, однако распаковать ее командой «upx -d bagabaga» не получится: в файле нарушена контрольная сумма. Чтобы получить код программы, можно снять дамп в памяти и восстановить таблицу импорта с помощью инструмента PE Tools (ищи мануал по использованию в интернете или в моей книге «Головоломки для хакера»). Программа содержит три ошибки переполнения буфера в стеке и одну ошибку форматной строки. На диске ты можешь найти полный исходный код программы bagabaga, а ниже приведена бажная функция Ok() из этого кода, которая содержит все уязвимости: // функция с четырьмя уязвимостями if (!strncmp(input, "baga", 4)) { } else if (strstr(input, "2008")) { } else if (input[3]=='X') { } else Как видишь, в функции определен буфер buf[50]. Ошибка форматной строки проявляется, только если в начале строки присутствует слово «baga». Например, если ввести строку «baga %d %d %d» (без кавычек), то можно посмотреть значения из стека. Первая ошибка переполнения буфера в стеке проявляется, когда переданная строка оказывается больше 50 символов и в начале строки присутствует слово «baga». Причина – в функции sprintf(buf, input), которая записывает в буфер buf строку input без всякой проверки на количество записываемых данных (заметь, в этой функции отсутствует еще и спецификатор формата). Вторая ошибка переполнения буфера в стеке проявляется, если передана строка больше 50 символов и в строке присутствует подстрока «2008». Причина – в функции strcpy(buf, input), которая не делает проверку на количество передаваемых в буфер данных. И третья ошибка переполнения буфера в стеке проявляется, если передана строка больше 50 символов и четвертым символом в строке является латинская буква X. Причина – в неверном использовании функции strncpy(buf, input, strlen(input)); третьим параметром в ней должна стоять sizeof(buf). ПЕРВЫЙ ПАЗЛ «СЪЕШЬ МЕНЯ»Определи правильный пароль к программе eatme.exe. Программа написана на Visual Basic 6.0. Программу eatme.exe можно найти на диске к журналу или на моем сайте www.sklyaroff.ru. ВТОРОЙ ПАЗЛ «ПОСТЕР»Файл Hackers.jpg (есть на диске, прилагаемом к журналу) содержит скрытое сообщение: найди его и вышли мне. ТРЕТИЙ ПАЗЛ «ВОССТАНОВИ БАЙТЫ»На рисунке показана COM-программа (68 байт), которая должна просто выводить на экран фразу «RESTORE BYTES OF THIS FILE, PLEASE!». Восстанови три байта (на картинке они замазаны красным цветом), чтобы программа работала правильно. ЧЕТВЕРТЫЙ ПАЗЛ «ABABA»Расшифруй: BAAABABAABABABABABBAAAAAABAAAAABBABAABABAABAB ПЯТЫЙ ПАЗЛ «ЗАГАДОЧНОЕ УРАВНЕНИЕ»Посмотри на примеры и определи, какое значение должно стоять вместо знака вопроса в последнем уравнении: A + A = 17 |