переполнение буфера стека
Переполнение буфера в стеке - это когда программа случайно или злонамеренно записывает данные за пределы экстента определенного элемента данных в стеке, такого как c-строка. Это приводит к изменению значений близлежащих элементов управления или структур данных в стеке (не кучи), что может привести к нежелательному поведению программы, например сбоям, ошибкам или изменению потока управления.
Обычно это не относится к записи за пределами самого стека, которая часто защищена защитными страницами для предотвращения случайного перегрузки или недостаточной загрузки.
| start of stack |
| data |
| parameters |
| return address |
| data |
| parameters |
| return address |
| parameters |
| return address | <- might overflow into this region or above
| string data | <- writes to this region ... (look up)
stack head
|
V direction of growth for pushes
...
| end of stack |
| guard page | <- writes to this region cause a segfault
...
| heap |
Стек вызовов в Linux
Стек вызовов имеет фиксированный размер, сам стек увеличивается и уменьшается в соответствии с требованиями этого предела.
Куча и стек не перекрываются и не разделяют память - они обычно управляются в разных областях виртуального адресного пространства.
Размер основного стека процесса определяется средой, существующей в момент запуска программы. Для функций c, чтобы установить это, смотрите man 3 ulimit
, а чтобы просмотреть / установить его из bash, смотрите, ulimit -s
для деталей.
> ulimit -s
8192
Если вы создаете свои собственные потоки, вы можете взять на себя ответственность за создание их стеков (см. man pthread_attr
), вы можете либо использовать рекомендуемый системой размер, либо установить свой собственный.