Adds random value before locals.
Adds function before return to check canary value.
Can rewrite a function pointer instead.
Stack is non executable.
We can do this by making every page either writable or executable.
However, does break JITs and introduces denial of service.
In addition, code injection may or may not be necessary in the first place.
Does not protect against ROP gadgets.
Memory is divided in 3 parts:
Not very good on 32-bit systems, but 64-bit has enough space to change around.