X-Puzzle
Иван Скляров
Xakep, номер #056, стр. 056-094-1
Sklyarov@real.xakep.ru
«ПРОЙДИСЬ ДЕБАГГЕРОМ ПО СВОИМ МОЗГАМ!»
Не стесняйся присылать мне свои ответы, даже если ты смог ответить всего на один пазл, я с интересом почитаю твои оригинальные решения. Ну, а имена героев, которые первыми правильно ответят на все вопросы, конечно же, будут опубликованы в журнале, чем прославятся на всю Россию (и не только) и навечно войдут в историю Х. Приз за нами не заржавеет ;).
Но помни: в большинстве случаев вариант ответа засчитывается как правильный, только если к нему приложено подробное и ВЕРНОЕ объяснение, почему выбран именно этот вариант, а не какой-либо другой.
ОТВЕТЫ К ПРЕДЫДУЩЕМУ ВЫПУСКУ X-PUZZLE
Ответы на пазл №1 «Разложи по полочкам»
1) Разъем RJ-45 может относиться только к физическому уровню, т.к. на этом уровне стандартизируются типы разъемов и назначение каждого контакта.
2) Свитч может охватывать физический, канальный и сетевой уровни.
3) MAC-адреса используются на канальном уровне.
4) В RFC792 описывается протокол ICMP - этот протокол принадлежит сетевому уровню.
5) В RFC2068 описывается протокол HTTP/1.1 — это протокол прикладного уровня.
6) Данные на канальном уровне называют «кадрами» (frames).
7) На сетевом уровне сообщения принято называть «пакетами» (packets).
8) Протокол SSL принадлежит к протоколам представительного уровня.
9) Протокол SPX принадлежит стеку Novell IPX/SPX и соответствует транспортному уровню OSI.
10) Протокол NetBIOS охватывает транспортный и сетевой уровни.
Ответы на пазл №2 «CryptFuck v3.1»
Слово «Ash» программа зашифрует следующим образом — «sEX». Алгоритм программы представляет собой обычный XOR с постоянным ключом «2600». Функция, реализующая данный алгоритм:
void crypt(char *str)
{
char *key="2600";
int i=0;
for (; *str != '\0'; str++) {
if (i>3) i=0;
printf ("%c", *str^=key[i++]);}
}
Ответы на пазл №3 «CGI+баги»
В первой баге достаточно включить проверку на null-байт ‘\0’, например, так:
$filename =~ s/\0//g.
Во второй баге строка «#$test=1;» закомментирована, поэтому никакие проверки в коде действовать вообще не будут. Т.к. ничего удалять нельзя, то достаточно перенести «$test=1;» на строку ниже, оставив символ комментария один на строке. Но этого мало, потому что далее не фильтруются потенциально опасные символы, а именно ‘\0’ и ‘/’, поэтому нужно добавить их в строку фильтрации:
$file =~ s/([\0\/.;\&<>\|\\\`'"?~^\{\}\[\]\(\)*\n\r])//g;
Третья бага связана с тем, что отсутствует какая-либо фильтрация опасных символов в переменной $to. В данном случае можно поступить следующим образом. В строке open перенести последнюю часть, а именно «$to");» ниже на строку и закомментировать (этот геморрой связан с тем, что ничего нельзя удалять), а вместо этого добавить «-t”);». Ключ –t, указывает sendmail искать адрес получателя в теле письма. Поэтому в теле мы должны добавить строку:
print MAIL “To: $to\n”;
В четвертой баге перепутаны местами операторы, идущие после if и else, т.е. достаточно исправить строку с проверкой условия так:
if (!($file =~ /^[\w\.]+$/))
Ответы на пазл №4 «Брутфорс и ламеры»