NOP Slide는 실행할 코드의 주소를 정확하게 알아내기 힘든 경우 메모리 영역에 프로그램에 실행에 영향을 주지 않는 NOP을 삽입하여 오차 범위를 줄이기 위해 사용하는 기법이다.
#include<stdio.h>
int main(int argc, char* argv[]){
char buffer[512];
strcpy(buffer, argv[1]);
printf("%s", buffer);
return 0;
}
JavaScript
복사
해당 파일은 root의 쉘을 획득하기 위해 SetUID 설정이 되어있다. (chmod 4755 ./bof)
gdb를 이용하여 디컴파일 시 버퍼의 크기가 0x208(520)Byte만큼 할당되어 있다.
버퍼에 NOP을 가득 채운 후 나머지 영역에 Shell Code를 삽입한다. 삽입 후 RET값이 스택의 최상단을 가리키도록 ESP의 주소를 넣어 스택의 최상단으로 점프시킨 후 다시 버퍼가 실행될 때 NOP을 만나 아무런 행위 없이 계속해서 아래로 흐르게 되며 마지막 Shell Code에 접근해 해당 코드를 실행하게 된다.
버퍼를 463(NOP) + 61(ShellCode) = 524만큼 채운 후 마지막에 esp 주소를 삽입한다. esp의 주소는 gdb에서 x/ $esp 명령을 이용하여 구한다.
코드를 여러 차례 반복 실행 시 root의 쉘을 실행시키는 것을 확인할 수 있다.