avatar
Миша пишет код
@misha_writes_code
11.03.2026 16:35
Каждый год на паре про бинарные уязвимости я позорюсь в одном и том же месте!

Есть вот такой код:


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! И в панике эту единицу-импостера еще попробуй разгляди!
😁 12
👍 8
🔥 5
3 8 704

Обсуждение 3

Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.

Обсудить в Telegram