Summary Attacker faces the following difficulties: 1. Must guess 32 bit number to overwrite frame pointer or return address 2. Flags/pointers are below buffers in stack frames 3. Nothing writeable in the address space is executable 4. signal() trampoline is not writeable 5. GOT, PLT, and dtor are not writeable 6. const data is not executable 7. atexit() and stdio _cleanup vectors are not writeable 8. Shared libraries mapped at different addresses each time 9. malloc() and mmap() provide randomized allocation 10. malloc() and mmap() put in guard pages (incomplete) 11. Top of stack is randomly biased 12. Many privileged daemons or programs revoke that privilege 13. Other privileged daemons or programs separate the privileges into another process