Ответов на этот вопрос очень много) Потому что вопрос сильно обобщенный.
Например можно ответить так: в вин32 дескриптор памяти написан плохо. В вин64 уже лучше.
Но для вин64 нужен 64-битный процессор. Отсюда все и лезет.
Если есть 64-битный процессор, то он имеет "в железе" например nx-бит. И 64-битный дескриптор написан как бы под него, если сильно притягивать заушы. Суммарно получается так, что код и данные разделены. И железо следит за этим. Т.е. нельзя запустить код из данных.
А на 32-битных системах это можно было сделать запросто, через ошибку переполнения. Т.е. вставляете исполняемый код в картинку, картинку в программку, и программкой запускаете код из картинки. Ранее во времена 32-бит на этом строились защиты массово, и ровно так же распространялись эксплойты массово.
В общем смысле 32-битные системы не имеют контроля исполнения кода. 64-битные уже имеют. Но под это дело нужна еще и вменяемая организация памяти. В современных версиях например win-64 это есть. Впрочем оно же есть во всех 64-битных системах насколько я помню. Реализация прикручена уже везде.