Почему стеки не растут вверх (для безопасности)? - PullRequest
28 голосов
/ 30 апреля 2010

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

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

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

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

Ответы [ 4 ]

25 голосов
/ 30 апреля 2010

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

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

ETA:

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

3 голосов
/ 08 мая 2010

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

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

3 голосов
/ 08 мая 2010

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

1 голос
/ 30 апреля 2010

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

...