В чем разница между переполнением стека и переполнением буфера?



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

315   9  

9 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2. Переполнение Буфера Кучи

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

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

    Ничего не найдено.

Добавить ответ:
Отменить.