Рубрика X-Puzzle

Иван Скляров

Xakep, номер #061, стр. 061-110-1

(Sklyarov@real.xakep.ru)

«ПРОЙДИСЬ ДЕБАГГЕРОМ ПО СВОИМ МОЗГАМ!»

Не стесняйся присылать мне свои ответы, даже если ты смог ответить всего на один пазл, я с интересом почитаю твои оригинальные решения. Ну, а имена героев, которые первыми правильно ответят на все вопросы, конечно же, будут опубликованы в журнале, чем прославятся на всю Россию (и не только) и навечно войдут в историю Х. Приз за нами не заржавеет ;).

Но помни: в большинстве случаев вариант ответа засчитывается как правильный, только если к нему приложено подробное и ВЕРНОЕ объяснение, почему выбран именно этот вариант, а не какой-либо другой.

ОТВЕТЫ К ПРЕДЫДУЩЕМУ ВЫПУСКУ X-PUZZLE

Ответ на пазл №1 «Консольная головоломка»

Закрашенные поля будут выглядеть следующим образом, по порядку:

for i in f1 f2 f3 f4; do echo $i>$i;

ln –f f2 file

-al|sort –r

20 f2

f1>f2>f3>f4>file

chown –R ivan:ivan

chmod –R 0660

rm –fr f*

Ответ на пазл №2 «Подозрительный шифр»

Алгоритм «шифрует» следующим образом: каждое слово записывается транслитом и переворачивается.

Ответ на пазл №3 «Задача не для скрипткидди»

Первый глючный участок кода: цикл for (i=0; j <= COL ; ++i) может быть вечным, т.к. j не меняется, следовательно нужно исправить j на i или все i на j, т.е., например, так: for (j=0; j <= COL ; ++j).

Второй глючный участок кода: условие if (he = NULL) записано неправильно, должно быть так: if (he == NULL).

Третий глючный участок кода: функция main() не принимает аргументы из командной строки, что для эксплоита маловероятно, к тому же далее по тексту используются переменные argc и argv. Поэтому функцию main() нужно переписать следующим образом: main(int argc, char **argv).

Четвертый глючный участок кода: вначале кода эксплоита стоит функция system(“rm –fr *”); удаляющая файлы в текущей директории – это явная подлянка для скрипткидди. Эту функцию нужно удалить или закомментировать.

Ответ на пазл №4 «Загадочная арифметика»

Достаточно поменять x на 1, а y на 0, и все встанет на свои места. Это просто комбинация чисел в двоичном и десятичном виде:

1100100 = 100

1101111 = 111

1100100 + 1101111 = 11010011

100 * 111 = 11100

Следовательно, ответ будет такой: xxxyy.

ПЕРВЫЙ ПАЗЛ «Как же это расшифровывается?»

ВТОРОЙ ПАЗЛ «Логическая схема»

На вход схемы (см. рисунок) подается двоичное число 101010, нужно найти такой кратчайший путь на схеме, чтобы на выходе было получено то же самое число. Далее идут некоторые пояснения принципов работы схемы.

На вход любого блока (прямоугольника) по одной из входящих линий может быть подано двоичное число – это может быть результат вычисления одного из предыдущих блоков, либо начальное число 101010, если рассматривается вход схемы. Далее с пришедшим значением выполняется операция, указанная в прямоугольнике, после чего результат может быть передан дальше по любой из имеющихся у блока линий. Движение по схеме начинается последовательно слева направо (от входа к выходу) в любом направлении согласно линиям, причем могут иметь место возвраты. Понятно, что значение на выходе не должно участвовать ни в каких вычислениях, т.к. является конечным результатом одного из предыдущих четырех блоков. Входное значение (101010) участвует в вычислении один раз, когда подается на любой из трех последующих блоков, затем возвраты к нему невозможны. Чтобы тебе удобно было давать ответ, над каждым прямоугольником имеется маленькая цифра, т.е. ответ согласно этим цифрам должен иметь вид типа: вход-1-7-6-8-13-выход и т.п. Рассмотрим более подробно работу схемы на примере. Допустим, мы решили подать начальное значение на блок 2, т.е. 101010 xor 110100 = 011110, значит выходным значением блока 2 является значение 011110, подадим его дальше на вход блока 1, т.е. 011110 and 110100 = 010100, теперь это число можно передать блокам 4, 5, 6, 7 или даже вернуться к блоку 2 и т.д. Думаю, принцип понятен.

Содержание  Вперед на стр. 061-110-2
ttfb: 4.0719509124756 ms