[포너블] Mitigration: NX & ASLR

Chris Kim·2024년 10월 16일

시스템해킹

목록 보기
12/33

문서 내용 출처: 드림핵

1. NX

1.1 개념

No-eXcute(NX) 는 실행에 사용되는 메모리 영역과 쓰기에 사용되는 메모리 영역을 분리하는 보호 기법이다. gdb에서 vmmap을 통해 NX 전후의 메모리 맵을 조회하고, 메모리 영역별 권한을 살펴볼 수 있다.

1.2 NX 확인

checksec을 통해 바이너리 NX 적용을 확인할 수 있다.
인텔은 XD(eXecute Disable), AMD는 NX, 윈도우는 DEP(Data Execution Prevention)이라고 부른다. ARM은 XN(eXecute Never)이라고 칭한다.

1.3 Return to Shellcode w/t NX

이전에 실습한 예제 r2s에 NX기법을 적용해보고 익스플로잇을 실행해보자.

2. ALSR

2.1 개념

Adress Space Layout Randomization(ASLR) 은 바이너리가 실행될 때마다 스택, 힙, 공유 라이브러리 등을 임의의 주소에 할당하는 보호 기법이다.

앞선 r2s 예제에서는 ASLR이 적용되어 있었고, buf의 주소가 변경되었다. 해당예제는 buf의 주소를 출력해주었으나, 일반적으로는 해당 buf의 주소를 구하는 과정이 선행되어야 한다. 다음 명령어로 커널에서 지원하는지 확인할 수 있다.

$ cat /proc/sys/kernel/randomize_va_space
2

0은 ASLR 미적용
1은 Conservative Randomization: 스택, 라이브러리, vdso등
2는 Conservative Randomization + brk: 1에 더해 brk로 할당한 영역

2.2 ASLR 특징

(1) main 함수 외의 다른 영역 주소는 실행마다 변경
(2) libc_baseprintf의 주소 하위 12비트는 실행되어도 그대로 유지된다. 왜냐하면 리눅스는 ASLR이 적용될때, 파일을 페이지(page) 단위로 임의 주소에 배정한다. 따라서 페이지 크기 12비트 이하로는 주소가 변경되지 않는다.
(3) libc_baseprintf의 주소 차이는 항상 같다. 실행마다 라이브러리 파일을 그대로 매핑하므로, 상대적 거리(Offset)는 항상 같다.

profile
회계+IT=???

0개의 댓글