Buffer overflow:
You are allowed to use: x
But you can use: 2x
Because in 2x+1 the return address is written and if you overwrite it will make the program crush
Sou you nop x, write the shellcode on 2x, and write your new return address on 2x+1 so jumps to the NOP sled and executes the payload.
Maybe practicing can help you: http://overthewire.org/wargames/narnia/
One last thing, you don’t wanna always execute a shellcode, sometimes you just need to change the program flow, or to change a var ;p
Good luck and Happy Hacking