В чем разница между переполнением стека и переполнением буфера? - PullRequest
61 голосов
/ 13 июля 2009

Чем отличается переполнение стека от переполнения буфера в программировании?

Ответы [ 10 ]

128 голосов
/ 13 июля 2009

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

Переполнение буфера относится к любому случаю, когда программа записывает за пределы памяти, выделенной для любого буфера (в том числе в куче, а не только в стеке). Например, если вы пишете после конца массива, выделенного из кучи, вы вызвали переполнение буфера.

18 голосов
/ 13 июля 2009

Ключевым отличием является знание разницы между стеком и буфером.

Стек - это пространство, зарезервированное для исполняемой программы. Когда вы вызываете функцию, ее параметры и возвращаемая информация помещаются в стек.

Буфер - это общий фрагмент памяти, который используется для одной цели. Например, строка является буфером. Его можно перезапустить, записав в строку больше данных, чем было выделено.

11 голосов
/ 13 июля 2009

Больше, чем вы, вероятно, хотите знать здесь:

Переполнение стека

Переполнение буфера

11 голосов
/ 13 июля 2009

Переполнение стека: вы поместили слишком много вещей в стек для памяти, выделенной текущему потоку

Переполнение буфера: Вы превысили размер выделенного в данный момент буфера и не изменили его размер для соответствия (или не можете изменить его размер далее).

5 голосов
/ 13 июля 2009

Переполнение стека - это когда размер стека для потока превышает максимально допустимый размер стека для этого потока.

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

3 голосов
/ 27 августа 2009

Разве вы не хотите сказать "в чем разница между стеком и буфером?" - это приведет вас к большему пониманию быстрее. Как только вы доберетесь до этого, вы можете подумать о том, что значит переполнить каждую из этих вещей.

3 голосов
/ 13 июля 2009

Переполнение буфера обычно означает всякий раз, когда к буферу памяти обращаются вне его границ, будь то стек или куча. Переполнение стека означает, что стек превысил установленный лимит и на большинстве машин / ОС работает в куче.

2 голосов
/ 06 декабря 2015

1. Переполнение буфера в стеке • Происходит, когда программа выполняет запись в адрес памяти в стеке вызовов программы за пределами предполагаемой структуры данных - буфера фиксированной длины. • Характеристики стекового программирования 1. «Стек» - это область памяти, в которой размещаются автоматические переменные. 2. Параметры функции распределяются в стеке и не инициализируются системой автоматически, поэтому они имеют мусор, пока не будут инициализированы. 3. Как только функция завершила свой цикл, ссылка на переменную в стеке удаляется. (т.е. если функция вызывается несколько раз, ее локальные переменные и параметры воссоздаются и уничтожаются при каждом вызове и выходе из функции.)
• Злоумышленник использует переполнения буфера на основе стека для различных манипуляций с программой, перезаписывая
1. Локальная переменная, которая находится рядом с буфером в памяти в стеке, чтобы изменить поведение программы, которая может помочь злоумышленнику.
2. Обратный адрес в кадре стека. Как только функция вернется, выполнение возобновится по адресу возврата, указанному злоумышленником, обычно это заполненный пользователем буфер. 3. Указатель на функцию или обработчик исключений, который впоследствии выполняется. • Факторы преодоления подвигов
1. Нулевые байты в адресах 2. Изменчивость в расположении шелл-кода 3. Различия между средами. Код оболочки - это небольшой фрагмент кода, используемый при эксплуатации уязвимости программного обеспечения.

2. Переполнение буфера в куче

• Происходит в области данных кучи. • Переполнение происходит, когда приложение копирует в буфер больше данных, чем предназначено для этого буфера. • Уязвим к эксплуатации, если копирует данные в буфер без предварительной проверки того, что источник будет соответствовать цели. • Характеристики программирования на основе стека и кучи: • «Куча» - это «свободное хранилище», то есть пространство памяти, когда выделяются динамические объекты. • Куча - это пространство памяти, динамически распределяемое функциями new (), malloc () и calloc (). • Динамически создаваемые переменные (т.е. объявленные переменные) создаются в куче перед выполнением и сохраняются в памяти до завершения жизненного цикла объекта. • Эксплуатация выполнена • Повреждение данных для переопределения внутренних структур, таких как указатели на связанный список. • Обмен указателями для отмены функции программы

0 голосов
/ 06 апреля 2019

Позвольте мне объяснить более простым способом с диаграммой оперативной памяти. Прежде чем приступить к этому, предлагаю прочитать о StackFrame, Heap Memory.

Как видите, стек растет вниз (показано стрелкой), предполагая, что это стек. Код ядра, текст, данные - это статические данные, поэтому они исправлены. Динамическая часть кучи растет вверх (показано стрелкой).

enter image description here

0 голосов
/ 24 сентября 2011

Большинство людей, которые упоминают о переполнении буфера, имеют в виду переполнение стека. Тем не менее, переполнение может происходить в любой области, не только ограниченной стеком. Таких как куча или бсс. Переполнение стека ограничено перезаписью адресов возврата в стеке, но обычное переполнение, которое не перезаписывает адрес возврата, вероятно, просто перезапишет другие локальные переменные.

...