A while back, I wrote about a buffer overflow I discovered while tackling a CTF style box. It's not a complete guide to buffer overflow but if you have some basic instructions on "how to", you can fill in those gaps that I've left unwritten.
When I first learned of buffer overflows, I was sort of following along with blind faith, hoping it would all work out in the end. At a certain point though, the tools we use become more familiar through other use. For example, MSFVenom will become widely used for more than just generating shellcode for buffer overflows. You'll go from mindlessly retying the text you see to understanding what you're actually typing. And then, hopefully, wanting to test what you're doing prior to pointing it at your victim machine.
In the line below, I'm generating Linux shellcode, the architecture is 64 bit, the shellcode will spawn a reverse shell, host and port are pointing back to my box, my format is C code, and I'm excluding the bad characters which could muck up the execution. Like the buffer overflow explanation in the above referenced post, I'm not drilling down completely because a lesson on why null byte, line feed, and carriage return could / will cause problems is an entire post on its own.