Если вы посмотрите на эти две строки трассировки стека, вы увидите, что страница, которая начинается с 0x8048000, должна быть исполняемой (поскольку два адреса на этой странице, 0x8048514 и 0x804858a, отображаются в стеке как адреса возврата).
. / A.out (__ gxx_personality_v0 + 0х100) [0x8048514]
./a.out(__gxx_personality_v0+0x176)[0x804858a]
Адрес, который вы пытаетесь освободить, 0x0804878d, имеет смещение 0x78d на той же странице, поэтому он, вероятно, указывает на код и определенно указывает на страницу, которая является исполняемой.