Все примеры проблем в моей текстовой книге показывают, что массивы буфера хранятся в стеке, что вызывает проблемы при перезаписываемом адресе. Однако буфер всегда находится в стеке? Я предположил, что массив будет написан где-то еще в памяти, а не в стеке.Является ли массив буфера, который всегда хранится в стеке?
ответ
Локальные переменные буферы, объявленные как постоянный размер (см. Нижеприведенный пример) или инициализированные немедленно, сохраняются в стеке.
char x[20];
или char x[] = "this buffer";
Даже если они затем передаются в функцию переменной останется сохраненной в стеке. Только дальше от выполняемой функции.
Если вы выделяете память для буфера, то она будет храниться в памяти кучи, а не в стеке.
char *x = (char *) malloc(LENGTH_OF_BUFFER);
Это когда heap spraying может стать необходимым для эксплуатации. Причина, по которой вы наблюдаете больше всего переполнения буфера в стеке, состоит в том, что это самый простой способ понять понятия эксплуатации.
Буферные массивы обычно хранятся в стеке. Однако их можно хранить в куче или в местах с фиксированной памятью - и все это предполагает, что вы имеете дело с языком (и архитектурой), который отличает стек и кучу.
Это зависит прежде всего от компилятора, где объявлен ваш буфер и как вызывается функция.
В C, в общем, локальные переменные выделяются в стеке, а также некоторые параметры, предоставляемые для вызовов функций (в соглашении о вызове cdecl *. Другие соглашения о вызовах могут подталкивать некоторые параметры через регистры или даже через прозрачное распределение кучи в некоторых случаях).
Некоторые языки и компиляторы будут выделять их по-разному. Например, в Delphi вы объявляете локальную переменную типа «строка», фактические данные будут храниться в куче, только указатель, выделенный для стека.
Наконец, программист всегда может решить явно выделить буферы в куче (или глобальной памяти).
Добро пожаловать на IS Stack Exchange. Некоторая дополнительная информация была бы полезна, например, какой язык программирования вы используете, потому что разные языки и даже разные компиляторы могут относиться к хранению переменных в массивах очень по-разному. –