본문 바로가기

SYSTEM HACKING

[SWING] Pwnable 03 - NX&ASLR

하나의 강력한 보안 장비에 의존 <<< 여러 겹의 보안 설비

 

공격자들은 보호 기법이 등장하면 우회하는 새로운 공격 기법을 만들어내곤 했음.

그러므로 시스템 개발자들은 공격 기법을 예상하기보다 공격당할 수 있는 표면 즉, Attack Surface를 줄이려고 노력함.

 

r2s 쉘 공격이 가능했던 이유:

1. 반환 주소를 임의 주소로 덮을 수 있음

2. 입력 버퍼의 주소를 알 수 있음

3. 버퍼가 실행 가능했음

 

=> 공격자가 메모리에서 임의 버퍼 주소를 알기 어렵게 할 것, 메모리 영역에서 불필요한 실행 권한 제거

=> ASLR, NX

 

ASLR

Address Space Layout Randomization

바이너리가 실행될 때마다 스택,힙, 공유 라이브러리 등을 임의의 주소에 할당하는 보호 기법

커널에서 지원

 

리눅스에서는 위의 명령어 결과가 0, 1, 2 중에 하나로 확인된다.

 

ASLR이 적용되는 메모리 영역

0 No ASLR ASLR 적용하지 않음
1 Conservative Randomization 스택, 힙, 라이브러리, vdso 등
2 Conservative Randomization + brk 1의 영역 + brk로 할당한 영역

 

#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
  char buf_stack[0x10];                   // 스택 버퍼
  char *buf_heap = (char *)malloc(0x10);  // 힙 버퍼
  printf("buf_stack addr: %p\n", buf_stack);
  printf("buf_heap addr: %p\n", buf_heap);
  printf("libc_base addr: %p\n",
         *(void **)dlopen("libc.so.6", RTLD_LAZY));  // 라이브러리 주소
  printf("printf addr: %p\n",
         dlsym(dlopen("libc.so.6", RTLD_LAZY),
               "printf"));  // 라이브러리 함수의 주소
  printf("main addr: %p\n", main);  // 코드 영역의 함수 주소
}

 

스택 영역 buf_stack, 힙 영역 buf_heap, 라이브러리 함수 printf, 코드 영역 함수 main, 라이브러리 매핑 주소 libc_base가 출력된다.

 

코드 영역의 main 함수를 제외한 다른 영역은 실행할 때마다 변경된다

-> 바이너리 실행 전 예측 불가

 

반복 실행해도 libs_base 주소 하위 12비트와 printf 주소 하위 12비트 값은 변경되지 않는다

-> 리눅스는 ASLR 적용 시 파일을 페이지 단위로 임의 주소에 매핑

-> 페이지 크기인 12비트 이하로는 주소 변경되지 않는다

 

libc_base와 printf 주소 차이 항상 같다

-> 라이브러리 파일을 임의 주소에 그대로 매핑

-> 매핑 주소로부터 다른 심볼들까지의 거리 즉, Offset은 항상 같다

 

 

 

NX

No-eXecute

 

AMD: NX( No-eXecute)

인텔: XD(eXecute Disable)

윈도우: DEP(Data Execution Prevention)

ARM: XN(eXecute Never)

 

실행에 사용되는 메모리 영역과 쓰기에 사용되는 메모리 영역을 분리하는 보호 기법

메모리 영역에 쓰기 권한과 실행 권한이 함께 있으면 취약해지기 때문

(ex. 코드 영역에 쓰기 권한 -> 코드 수정, 스택/데이터 영역에 실행 권한 -> Return to Shellcode)

 

CPU가 NX를 지원하면 컴파일러 옵션을 통해 바이너리에 NX 적용 -> 실행될 때 각 메모리 영역에 필요한 권한만 부여받음

gdb vmap으로 메모리맵 확인 가능

checksec으로 바이너리에 적용 여부 확인 가능

 

NX 적용된 바이너리 코드 영역 외 실행 권한 없음
NX 적용되지 않은 바이너리 스택 영역에 실행 권한 있음