Почему стеки не растут вверх (для безопасности)?

Это связано с вопросом, 'Почему стеки обычно растут вниз?', но больше с точки зрения безопасности. Я обычно обращаюсь к x86.

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

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

Если бы стек вырос вверх в памяти, то переполнение буфера просто не работало бы в к мертвой памяти? Это улучшило бы безопасность? Если так, почему это не было сделано? Что относительно x64 те стеки растут вверх и если не почему нет?

28
задан Community 23 May 2017 в 12:01
поделиться

4 ответа

Технически это зависит от ОС / ЦП, но обычно это происходит потому, что стек и куча растут в противоположных направлениях и с противоположных концов адресного пространства.

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

ETA:

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

25
ответ дан 28 November 2019 в 03:43
поделиться

Вероятно, потому что архитектура большинства процессоров была разработана в то время, когда мужчины были мужчинами, и вы могли быть уверены, что ваши программисты не захотят воровать номера кредитных карт людей. ... сейчас уже слишком поздно что-то менять (хотя, как вы говорите, это, вероятно, можно было бы сделать для новых архитектур, таких как Itanium , который на самом деле имеет два стека !)

{{ 1}}
1
ответ дан 28 November 2019 в 03:43
поделиться

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

3
ответ дан 28 November 2019 в 03:43
поделиться

В архитектуре 8088 (начало семейства x86) использовался стек, растущий вниз, и для совместимости он так и остался с тех пор. В те времена (начало 80-х) уязвимости переполнения буфера на домашних компьютерах были далеко за пределами радара.

Я не могу сказать, почему они решили, что стек будет расти вниз, хотя интуитивно кажется, что он должен расти вверх. Однако, как уже упоминалось, память часто делилась на стек и кучу; возможно, разработчик процессора решил, что важно, чтобы куча росла, и поэтому стек стал расти вниз.

3
ответ дан 28 November 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: