하나의 강력한 보안 장비에 의존 <<< 여러 겹의 보안 설비
공격자들은 보호 기법이 등장하면 우회하는 새로운 공격 기법을 만들어내곤 했음.
그러므로 시스템 개발자들은 공격 기법을 예상하기보다 공격당할 수 있는 표면 즉, 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 적용되지 않은 바이너리 | 스택 영역에 실행 권한 있음 |
'SYSTEM HACKING' 카테고리의 다른 글
[SWING] Pwnable 04 - Format String Bug (0) | 2023.11.11 |
---|---|
[SWING] Pwnable 03 - PLT&GOT (0) | 2023.09.25 |
[SWING] Pwnable 03 - 스택 카나리 (0) | 2023.09.25 |
[SWING] Pwnable 02 - Stack Buffer Overflow (0) | 2023.09.25 |
[SWING] Pwnable 01 - gdb, pwntools 설치 (0) | 2023.09.25 |