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