pwn 문제를 풀면서 shellcode를 적고 shellcode의 주소로 ret을 덮어서 실행 시킬 때 다양한 이유들로 쉘 코드의 주소에 offset 차이가 생길 수 있다. 이 경우 계속 exploit에 실패하게 될텐데 shellcode 앞에 nop인 '\x90'을 길게 붙이면 어느정도 offset 차이가 발생하더라도 가리키는 주소가 shellcode 앞에 있는 nop zone에 포함되어 nop 명령어가 실행되면서 쉘코드까지 미끄러지듯이 실행될 수 있다.
보통 aslr이 걸려있지 않은데도 offset 차이가 발생하는 경우들이 있다. gdb로 실행 시킬 때나, 그냥 실행 시킬 때, 혹은 로컬과 서버에서 실행 시킬 때, offset의 차이가 발생하게 되는데 이는 서로 다른 환경의 env 때문에 발생한다. gdb를 실행할 경우 gdb의 env들이 있고 로컬과 서버의 env 즉 환경변수들이 다르므로 offset이 달라진다.
위의 그림은 memory layout인데 env들은 stack의 최상단에 위치해 있기 때문이다. 밑에 생기는 모든 주소들에 offset의 차이가 발생한다. 따라서 이럴경우 nop sled가 효과가 좋다. 아니면 입력 값을 길게 줘서 segmentation fault를 일으킨 다음 core dump를 확인하는 방법도 있다.