Переполнение буфера

Популярная, старая, но все еще актуальная уязвимость, возникает, когда для данных выделено не достаточно памяти (буфера).
Характерна для языков программирования, в которых памятью управляют (могут управлять) разработчики (С, С++ и т.д.).
Пример:

char src[6]= "Hello";
char dest[5];
strcpy(dest, src);
printf("src- %s", src); // src- 
printf("dest- %s", dest); // dest- Hello

В стеке, адреса памяти назначаются последовательно, следовательно, то что не вместилось в стек dest, начало перезаписывать нижестоящий стек, src.