Защита доступа к памяти не очень тонкая.Когда вы выделяете некоторую память, вы получаете целую страницу памяти, выделенной для вашей программы.Когда вы пытаетесь получить доступ к этой дополнительной памяти, это, скорее всего, будет успешным, но вы также можете использовать и другую память, выделенную вашей программе.
Вот почему переполнение буфера работает как атака.Во многих случаях предсказуемо, для чего используется эта дополнительная память после использования вашего массива.Если я смогу контролировать то, что вы положили туда, я могу перезаписать данные, которые вы не хотите, чтобы я перезаписывал.Если я могу перезаписать ваш стек вызовов, то я могу выполнить любой код, который я хочу, в контексте вашего процесса.Если это служба, работающая от имени администратора, то у меня есть локальное повышение привилегий.Если это какая-то служба, ориентированная на Интернет, то у меня атака на удаленное выполнение.
Лучше всего работать с более надежными структурами, такими как std :: vector, если у вас нет особой цели использования массивов.,(И даже тогда вы могли бы уйти с векторами ).