본문 바로가기

System Security/Technology

NOP Sled

NOP Sled (RET Sled) 란? 

NOP Sled 방식은 Buffer overflow 공격에 자주 사용되는 방식으로 NOP라고 불리는 어셈블리 명령을 사용하여 공격에 대한 오차 범위를 줄이기 위한 의도로 사용되는 방법이다. NOP를 만나면 아무것도 하지 않고 다음 명령으로 넘어가는 것이 연속적으로 일어날 때 마치 썰매를 타는 것과 같다 하여 Sled (썰매)라는 말이 붙어 NOP Sled라고 부르게 되었다고 한다. 

NOP (No operation) 란?

NOP란 No operation의 줄임말로 어셈블리 명령이다. 이 명령은 1 바이트로 되어 있으며 실제로 아무 것도 하지 않는다. 이 명령은 컴퓨터 내부에서 타이밍을 맞추기 위해 내부 사이클을 소모하는데 쓰인다. 또는 스팍(Sparc) 프로세서에서 명령 파이프라이닝을 하는데 쓰인다. 

 

이제 NOP가 어떻게 사용되는지 예시를 통해 알아보도록 하자. 

bof.c

위 프로그램은 첫 번째 Argument로 받은 값을 buf 에 String Copy 시켜주어 출력하는 코드이다. 위 코드에서 취약한 부분은 strcpy 함수가 길이 상관없이 입력에 따라 모두 Copy 시켜버리기 때문에 buffer에 Overflow가 발생할 수 있다는 것이다. 

 

Compile

gcc -m32 -mpreferred-stack-boundary=2 -fno-stack-protector -z execstack -no-pie -fno-pic -o bof bof.c

이제 이를 컴파일 하여 NOP Sled 기법을 사용하여 Buffer Overflow를 수행해보자. 

Buffer Overflow 공격을 수행하는 데 있어 환경 변수를 사용하여 공격을 수행해보도록 하겠다. 환경 변수를 사용하는 이유는 NOP를 넣을 때 Return address 뒤로 NOP를 넣을 공간이 없거나 혹은 넣을 수 없도록 되어 있는 경우, 환경 변수에 NOP + SHELLCODE 값을 가진 환경 변수를 만들어 놓으면 이를 우회할 수 있기 때문이다. 또한 주소가 랜덤 하게 변함으로써 Buffer Overflow 공격을 막기 위해 사용되는 ASLR 메모리 기법을 NOP를 많이 넣음으로써 우회할 수도 있다. 

 

프로그램마다 환경 변수가 스택에 무조건 삽입된다는 점을 이용한 것이다. 

 

환경 변수 지정 

export SHELLCODE=`python -c "print '\x90' * 100 + '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80'"`

 

이후, main 함수의 어셈블리 코드를 보면 sub esp, 0x28을 통해  SFP까지  덮기 위해선 44 bytes가 필요함을 알 수 있다. 

메모리 구조가 아래와 같으므로 SFP 까지는 Dummy 값을 넣어주고, Return Address에 SHELLCODE 환경 변수가 지정된 주소로 Return 시키도록 하면 NOP를 타면서 셸 코드가 실행될 것이다. 

Return Address
(4 bytes)
SFP (이전 함수의 EBP)
(4 bytes) 
buf
(40 bytes)

위 시나리오 대로 진행하기 위해 SHELLCODE 환경 변수가 어느 주소에 있는지 확인해야 한다. 이를 위해, 스택의 아래 부분을 살펴봐야 한다. x/1000s $esp를 통해 찾다 보면, 아래와 같이 환경 변수가 선언된 것을 확인할 수 있다. 

이제 Payload를 작성해보면, SFP 까지 덮는 Dummy(44 bytes) + SHELLCODE 환경 변수 주소 (4 bytes)를 실행시키면 아래와 같이 SHELL을 딸 수 있게 된다. 

이렇게 Buffer Overflow 공격에 자주 사용되는 NOP Sled 방식에 대해 알아보았다. 

'System Security > Technology' 카테고리의 다른 글

메모리 보호 기법  (0) 2022.02.13
CTF Tools  (0) 2022.02.13
Use after free  (0) 2022.01.23
GOT Overwrite  (0) 2022.01.22
스택 프레임(Stack Frame)이란?  (0) 2022.01.18