Каждый год на паре про бинарные уязвимости я позорюсь в одном и том же месте!
Есть вот такой код:
char input[9];
char password[9] = "password";
scanf("%s", input);
if (strcmp(input, password) == 0) {
printf("Access granted\n");
} else {
printf("Access denied\n");
}
И из-за особенностей работы scanf в input можно ввести больше символов, чем ожидается, переполнить буффер и перезаписать password так, чтобы проверка ниже проходила.
Например, можно подать
'aaaaaaaa\0aaaaaaaa\0' через
echo -e и программа выведет "
Access granted".
Так вот, каждый год я в этом месте говорю про стек, переполнение и дальше спрашиваю: "Какой надо подать ввод, чтобы проверка прошла?"
И по какой-то причине студенты
всегда говорят '11111111\011111111\0', я без задней мысли это ввожу и программа выдает "
Access denied", опровергая все, что я только что рассказывал.
Ну и я иду ковыряться в гдб и разбираться, почему же ничего не работает.
А дело в том, что
echo -e поддерживает escape-последовательности вида
\0NNN, где
N - цифра от 0 до 7. Такая последовательность интерпретируется как байт с соответствующим кодом. И поэтому на самом деле вместо 4х байт я ввожу всего 1.
А самое обидное, что
\0111 соответствует символу
I, и поэтому даже если напечатать эту строку, то получится
11111111I11111! И в панике эту единицу-импостера еще попробуй разгляди!
Обсуждение 3
Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.
Обсудить в Telegram