Почему стеки не растут вверх (для обеспечения безопасности)?
Это связано с вопросом "Почему стеки обычно растут вниз?" , но больше с точки зрения безопасности. Я вообще ссылаюсь на x86.
Мне кажется странным, что стек будет расти вниз, когда буферы обычно записываются вверх в память. Например, типичная строка С++ имеет свой конец с более высоким адресом памяти, чем начало.
Это означает, что если есть переполнение буфера, вы переписываете дальше стек вызовов, который, как я понимаю, является угрозой безопасности, поскольку он открывает возможность изменения адресов возврата и содержимого локальной переменной.
Если стек вырос вверх в памяти, не будет ли переполнение буфера просто запущено в мертвую память? Это улучшит безопасность? Если да, то почему это не было сделано? Как насчет x64, эти стеки растут вверх, а если нет, то почему?
Ответы
Ответ 1
Технически это зависит от ОС/ЦП, но обычно это происходит потому, что стек и куча растут в противоположных направлениях и с противоположных концов адресного пространства.
Эта компоновка дает вам максимальную гибкость для разделения/распределения памяти между кучей и стеком, не заставляя их сталкиваться. Если бы они оба выросли в одном направлении, тогда вам понадобится начальный адрес для стека, который поставил бы жесткий предел максимального размера кучи (и жесткого ограничения на размер стека)
ETA:
Нашел интересную статью о википедии о том, почему создание стека растет вверх, не обязательно предотвращает переполнение стека - это просто заставляет их работать немного по-другому.
Ответ 2
Ну, я не знаю, будет ли направление роста стека сильно влиять на безопасность, но если вы посмотрите на архитектуру машины, то рост стека в направлении отрицательных адресов действительно упростит соглашения о вызовах, указатели кадров стека, локальное распределение переменных и т.д. и т.д.
Ответ 3
Архитектура для 8088 (начало семейства x86) использовала стек, который рос вниз, и для совместимости с тех пор он был таким. В то время (ранние 80-е годы) уязвимости переполнения буфера на домашних компьютерах были хорошо защищены от радара.
Я не мог рассказать вам, почему они решили, что он растет, хотя, когда кажется более интуитивным, чтобы он вырос. Как уже упоминалось, память часто разделялась между стеком и кучей; возможно, проектировщик ЦП считал, что важно, чтобы куча выросла, поэтому в результате стволовые потоки выросли.
Ответ 4
Вероятно, потому что архитектура для большинства процессоров была разработана в то время, когда мужчины были мужчинами, и вы могли бы доверять своим программистам, чтобы не захотеть украсть людей номерами кредитных карт... это в основном слишком поздно, чтобы меняться сейчас (хотя, как вы говорите, возможно, это было возможно для новых архитектур, таких как Itanium у которого фактически есть два стека!)