Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

ETA:

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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