Рубрика X-Puzzle#7

Ведущий: Иван Скляров

Xakep, номер #053, стр. 053-110-2


ВТОРОЙ ПАЗЛ «Исправь баги»

Ниже приведены четыре листинга кода на языке Си, твоя задача - правильно определить типы ошибок, содержащихся в них (Format String, Heap Overflow, Integer Overflow, Buffer Overflow). И это еще не все. Необходимо также внести изменения в код, которые бы избавляли программы от этих багов, причем ничего удалять нельзя, можно только добавлять. Чем меньше будет добавок, тем лучше.

Листинг #1

#include <stdio.h>

#include <stdlib.h>

int main(int argc, char **argv) {

int rub, sum;

rub = atoi(argv[1]);

sum = 1000000000;

printf(“Добавление денег в бюджет\n\n”);

if (rub<0) {

printf(“Вводи только положительные\n”);

} else {

sum += rub;

printf(“Всего %d\n”, sum); }

return 0;

}

Листинг #2

char buff[1000];

int i;

for (i=0; (buff[i] = getchar())!=EOF; ++i)

if (buff[i]==’.’) buff[i]=’ ’;

Листинг #3

#include <stdio.h>

#include <stdlib.h>

int main(int argc, char **argv) {

char *one, *two;

one=malloc(100);

two=malloc(100);

if (argc>1)

strcpy(one, argv[1]);

free (one);

free (two);

return 0;

}

Листинг #4

#include <stdio.h>

int main(int argc, char **argv) {

int i;

if (argc>1) {

for (i=1; i<argc; ++i)

fprintf(stderr, argv[i]);

} else

printf(“Введи хоть один параметр, твою мать\n”);

return 0;

}

ТРЕТИЙ ПАЗЛ «CRYPTFUCK v2.1»

Из писем я понял, что самые популярные среди читателей пазлы в основном связаны с криптографией. Поэтому я постараюсь почаще возвращаться к этой теме. Конечно, сложных и замороченных алгоритмов я придумывать не буду, т.к. тебе приходится отгадывать пазлы в сжатые сроки, но вот то, что задачи будут с изюминкой, обещаю.

А теперь радуйся! M.J.Ash скачал второю версию программы CryptFuck в надежде, что сейчас-то она будет работать лучше. Он набрал в поле ввода слово «Ivan» (без кавычек) и нажал кнопку Crypt, программа выдала следующий шифр:

61112616626141261562

Затем он набрал «Sklyarov» и получил следующий шифр:

2123121531215412171121411216212157121661

И что-то опять не понравилось ведущему самой варезной рубрики. Введя последнее слово «Ash» и посмотрев на полученный шифр, M.J.Ash окончательно разгадал алгоритм шифрования, после чего ему, как и в прошлый раз, пришлось удалить программу со своего винчестера (он совершенно не хотел рекомендовать читателям программу со столь нестойким алгоритмом шифрования). Как «CryptFuck v2.1» зашифровал слово «Ash»? На этот раз ответ я засчитаю как правильный, только если к нему будет приложен программный код, реализующий алгоритм шифрования. Программу можно писать на любом языке программирования (надеюсь, ты не динозавр, который кодит на Фортране или PL/1), но мой вариант ответа будет на C++.

Ждем выхода третьей версии CryptFuck :).

ЧЕТВЕРТЫЙ ПАЗЛ «Пропускная система»

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

Назад на стр. 053-110-1  Содержание  Вперед на стр. 053-110-3