Um, usually buffer overflow is good method, and is how fuzzers work.
First, you need to have your own copy of the service that your attacking so you can debug it locally and see what your buffer is doing. Otherwise, you really won't get anywhere other than maybe killing the service your attacking.
Once you got that covered: Basically, you find some variable you want to test like USER, PASS, or different commands available to the a service such as FTP's various commands.
Next you throw a ton of digits at it... like 3,000 A's. Basically, you want to make the service choke on the input and die. Once you do that, it's time to change your 3,000 A's into a random string. There are string generation tools in Kali to do this. Why create this string? Cuz now you can you can throw this new buffer at the service and see exactly which bytes in your string are overwriting the "buffer." Iin a debugger, you want to see which exact digits in your string took over the EIP register.
Once you get the EIP register, the hard part begins. You basically have X amount of characters to insert your shell code (the thingy that gives remote code execution) as well as all the stuff you need to do to trick the application into pushing the memory location of that shell code on top of the stack and execute (JMP ESP).
I guess, think about Michelangelo carving David out of marble. Buffer overflows are the same way. You start with a block of A's, but through experimentation, you end up with a new exploit. I'd recommend the OSCP course from Offsec if you want to actually learn how to do this.