Как опция -fstack-protector в gcc предотвращает разрушение стека?

Я столкнулся с проблемой разбивания стека, и мне трудно найти причину. Ошибка разрушения стека возникает только изредка и только в самом конце выполнения программы. Это также перестает происходить полностью, когда я компилирую его с помощью опции 'fstack-protector' с gcc. Мне интересно, является ли использование опции 'fstack-protector' реальным решением или я просто скрываю проблему? Я бы опубликовал код, но он длиной 3000 строк, и я не уверен, какая часть кода отвечает.

1 ответ

Решение

Эта опция не предотвращает разрушение стека, а скорее обнаруживает его и останавливает программу.

Со страницы руководства gcc:

-fstack-протектор

Выдать дополнительный код для проверки переполнения буфера, например, атак с разбиванием стека. Это делается путем добавления переменной защиты к функциям с уязвимыми объектами. Это включает в себя функции, которые вызывают "alloca", и функции с буферами размером более 8 байт. Защитные устройства инициализируются при входе в функцию, а затем проверяются при выходе из функции. Если контрольная проверка не пройдена, выдается сообщение об ошибке и программа завершается.

У вас все еще есть проблема переполнения, но добавление переменных защиты, очевидно, маскирует проблему. Если вы запускаете вашу программу под Valgrind, она должна быть в состоянии обнаружить, что происходит.

Другие вопросы по тегам