This document discusses buffer overflow exploits and format string vulnerabilities. It begins with an overview of ELF binaries and how programs are laid out in memory. It then covers the stack and how buffer overflows can be used to overwrite the return address on the stack to redirect program flow. The document introduces shellcode that can be used to spawn a shell. It provides examples of exploiting programs using buffer overflows and placing shellcode in environment variables or directly in buffers. The document also covers format string vulnerabilities and how extra format specifiers can be used to read/write memory to bypass the need for a buffer overflow in some cases.