Миша пишет код
@misha_writes_code
Миша пишет код
Каждый год на паре про бинарные уязвимости я позорюсь в одном и том же месте!
Есть вот такой код:
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! И в панике эту единицу-импостера еще попробуй разгляди!
YouTube
АКОС2. #7 Бинарные уязвимости
Вторая часть курса АКОС.
Смотрим на ошибки переполнения буфера и к чему эти ошибки могут приводить. Разбираемся со стеком и меняем return address и содержимое стека, чтобы исполнять свои инструкции или обходить проверки.
Ведет Миша Филитов
Конспект:
https://github.com/lll-phill-lll/hse_caos_practice/tree/master/caos2-07-hacks
Канал:
https://t.me/misha_writes_code
Архитектура компьютера и операционные системы.
Семинарское занятие ФКН ПМИ. НИУ ВШЭ
0:00 - Обходим пароль
20:20 - Вызов запрещенной функции
44:00 - Канарейка
52:08 - Записываем свой бинарь на стек
1 3 567