Ваш вопрос, по-видимому, предполагает, что segfault происходит после завершения программы.Это на самом деле происходит во время выполнения, скорее всего, при выполнении неявного оператора return в конце основной функции.
При запуске программы на C система выполняет небольшую инициализацию перед вызовом основной функции (обычно этофактическая точка входа - функция _start()
и _start()
вызовы main()
).Внутренне, вызов функции main()
сохраняет адрес возврата (адрес, к которому можно вернуться после завершения функции).Очевидно, это зависит от процессора и компилятора, но адрес возврата часто сохраняется в стеке рядом с массивом p
.При переполнении буфера на p
вы можете перезаписать адрес возврата, поэтому при попытке возврата main()
все идет не так.Скорее всего, программа перейдет по адресу, который не существует или не является исполняемым.
Обратите внимание, что злоумышленник может использовать этот тип ошибки, чтобы попытаться перейти в указанное место и выполнить фрагмент кода, которыйне должен был быть казнен.