Другие языки программирования и технологии

Вопрос к программистам про переполнение буфера.

Как его переполняют.
Ну например если ввести пользовательский ввод со scanf (не введя сколько символов нужно ввести) то говорят что может переполнить буфер. А как хакеры взламывают переполняя его? На языке програмирования не будет действовать компьютер же его не понимает. А что остаётся? Скопировать кракозябры перекомпилированного файла которые можно посмотреть командой cat и названием испольняемого файла?
1. Надо знать архитектуру процессора (в первую очередь, стек, вызов подпрограмм, возврат из подпрограмм) и ассемблер этого процессора.

2. Надо понимать, как в языке C/C++ (подавляющее большинство атак производится на программы, написанные на этих языках) выделяется память для переменных.

Если буфер является локальной не статической переменной, то место под него выделяется в стеке ВЫШЕ хранящегося в этом же стеке адреса возврата из подпрограммы. Потому один из простейших вариантов атаки:

1. В качестве данных передаём набор команд процессора (вредоносный код), который записывается в буфер.

2. Используя переполнение буфера, меняем записанный в стеке адрес возврата на адрес начала вредоносного кода в буфере.

3. При выходе из подпрограммы, заполнявшей буфер, происходит переход на наш вредоносный код.
Валерий Носков
Валерий Носков
56 167
Лучший ответ
Аль - Таир А ты сам можешь эти атаки делать ?
Аль - Таир да мне насрать на все, я вашу крутость хотел узнать, на что вы способны короче)
Джафар-Сюзанна Джафаровых А как ты это всё знаешь? 1. Надо знать архитектуру процессора (в первую очередь, стек, вызов подпрограмм, возврат из подпрограмм) и ассемблер этого процессора.
Сможешь подсказать книги по этому хотелось бы узнать про это.
Простенький работающий пример "атаки" и к чему может приводить переполнение буфера - на большинстве компиляторов сработает:

https://www.ideone.com/ZeTpe4

Здесь то-же самое, но удобнее поиграть:
https://onlinegdb.com/B1sv8fflD
Введите первым шагом логин-пароль:
petya 012345ABCDEFG
вторым:
ABCDEF G

Казалось бы вполне обычный код - проверяем юзера и пароль в "таблице" логинов и паролей, даём 3 попытки. Однако из-за переполнения - мы 1ым шагом убиваем следующую за нами пару логин-пароль, а вторым шагом его уже и вводим и получаем "доступ". Не зная изначального верного логина и пароля (vasya и pup)
И это не ошибка алгоритма и вызова сравнений - там всё в порядке, а ошибка именно из-за переполнения. В этом легко убедиться вводя значения меньше 6 символов.

ЗЫЖ Да там вместо %d лучше-бы %ld использовать, но не суть.
Кст. на одной из олимпиад по программированию в школе была очень похожая плюха в предоставляемом коде. Надо было найти одну уязвимость, а по факту их было две.
Нет