avatar
Миша пишет код
@misha_writes_code
17.03.2026 19:37
Миша пишет код Каждый год на паре про бинарные уязвимости я позорюсь в одном и том же месте! Есть вот такой код: 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! И в панике эту единицу-импостера еще попробуй разгляди!
Сама пара:
https://youtu.be/hHiVtDtJagM

Через buffer overflow обошли пароль, затем через замену return address смогли вызвать произвольную функцию в чужом коде. Ну а потом загрузили на стек произвольный бинарь и заставили его выполняться.

Хотел еще сказать, как этого добиться с выключенным execstack, но не успели (

Всякие интересные ссылки с пары и по теме:
1. Почти тьюринг полный printf: https://www.ioccc.org/2020/carlini/index.html
2. ROP compiler: https://github.com/pakt/ropc
3. Smashing The Stack For Fun And Profit - https://inst.eecs.berkeley.edu/~cs161/fa08/papers/stack_smashing.pdf
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 - Записываем свой бинарь на стек
🔥 15
👍 3
1
1 3 567

Обсуждение 1

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

Обсудить в Telegram