
Прошла олимпиада связанная с информатикой, вопросы были вполне сложные, но вот этот, который я сфотографировал, ввёл в заблуждение меня и всех моих друзей. Прошу помочь, и ответить на вопрос в задании: где критическая ошибка, которая без знания пароля, выводит сообщение 'добро пожаловать'? Заранее спасибо за подробный ответ с хотя бы небольшим пояснением!
При переполнении int ATTEMPT (число попыток ввода) возникнет ситуация, когда int ATTEMPT станет отрицательным (т. к. количество попыток в цикле не ограничено, а int объявлен как число со знаком) и постоянно плюсует 1 к попыткам ввода. Когда int достигнет максимально допустимого положительного значения очередное увеличение "переполнит" его и кол-во попыток станет отрицательным, что приведет к противоречию ATTEMPT >0 и выполнится FLAG=true.
Когда такая ситуация произойдет - зависит от компилятора. н-р при 32768 (если int двухбайтовый) попытке ввода неправильного пароля.
Ключевые строки:
int ATTEMPT; //число обозначено, как знаковое)
ATTEMPT++; //Не проверяется на переполнение
if (strcmp....&& ATTEMPT > 0) ; Ключевая ошибка
do {
} while (1=1); //Бесконечный цикл, позволяющий "бесконечное" число попыток
P.S: cheak? имхо check ;)
И кст. программа уязвима для переполнения буфера.. . Если бы BUFFER был описан до пароля, при условии что компилятор не соптимизирует расположение - можно было бы провести ещё одну атаку, когда флаг бы стал = true.
Тут синтаксическая ошибка, из-за которой код (дельфийский по крайней мере) просто не скомпилируется. В остальном все выглядит кошерно.
Переполнение после 2 миллиардов (!) попыток - это да, но если в дельфийском компиляторе будет установлена проверка переполнения, этого тоже не произойдет.
Есть ещё одна проблема: пароль не должен храниться в открытом виде.
Любой пользователь может его прочитать в текстовом редакторе.
Не подходит под условие, но всё же…
Также вынужден заметить, что код слева не должен компилироваться без #include stdio.h, stdbool.h, по крайней мере C-компилятором.
ЗЫ
Как-то странно искать критические ошибки в программе, которая вообще не компилится. Не находите?