even if this were not so, there are other ways. the most damning is the so-called return to libc method for shellcode creation. in this attack the malicious payload will load the stack not with shellcode, but with a proper call stack so that execution is vectored to a chain of standard library calls, usually with the effect of disabling memory execute protections and allowing shellcode to run as normal. this works because the execution never actually vectors to the stack itself.