Puede que se deba a lo siguiente.
Si en un programa con un stack overflow llegas a sobreescribir la dirección de retorno, el programa intenta ejecutar la dirección sobreescrita y fallará si no está definida esa zona de memoria como zona con permisos de ejecución.
Por ejemplo con este programa pasaría eso:
#include <stdio.h>
int main()
{
char x[4];
strcpy(x, "xxxxAAAAAAAAAAAAAAA");
printf("OK");
return 0;
}
Con este programa después del strcpy la dirección de retorno se cambiaría por las AAAAAA y después del printf al hacer el return fallaría al intentar ejecutar la dirección 0x41414141.
Sin embargo si nos pasamos de datos y llegamos a escribir tanto en el stack overflow que nos salimos del área de stack y intentamos escribir fuerra de ella en una zona de memoria sin definir el programa en el strcpy se cerraría y no llegaría ni a hacer el printf, como por ejemplo aquí:
#include <stdio.h>
int main()
{
char x[4];
strcpy(x, "xxxxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa");
printf("OK");
return 0;
}
Eso sería en caso de que tu programa fuera un stack overflow lo que tuviera, que lo mismo tiene un heap overflow o cualquier otra cosa...