쉘코드를 써보지 않으시고 질문하신게 아닌가 싶네요
쉘코드는 메모리상에 어딘가에 적재를 시켜두고, 그 적재된 위치를 아는 상태에서 EIP가 쉘코드를 가르키게 해 사용합니다. 이 때 쉘코드가 올라가는 메모리는 write와 execute가 모두 가능해야합니다 즉 NX가 걸려있지 않아야 합니다
/bin/sh는 단순히 쉘 프로그램의 경로일 뿐입니다
/bin/sh라는 문자열이 프로그램에 있다고 해서 쉘을 실행할 수 있는게 아니라
쉘을 실행하는 코드를 넣어야 하는 겁니다
그래서 보고 계신 문서에서 execve 시스템콜을 사용할텐데 그게 프로그램을 실행시켜주는 시스템콜입니다