2023. 8. 29. 16:20ㆍSecurity/System
ASLR (Address Space Layout Randomization)
ASLR은 바이너리가 실행될 때마다 스택, 힙 공유 라이브러리 등을 임의의 주소에 할당하는 보호 기법이다.
cat /proc/sys/kernel/randomize_va_space
위와 같은 명령어를 통해 ASLR이 적용되는지 확인할 수 있다.
위 명령어의 결과값은 0, 1, 2로 나뉘는데 각 값의 의미는 다음과 같다.
0 : No ASLR
1 : Conservative Randomization(stack, heap, lib, vdso etc)
2 : Conservative Randomization + brk(allocated memory by brk)
ASLR의 특징으로는
1. main함수의 영역은 고정됨
2. 라이브러리 매핑 주소와 라이브러리 특정 함수 주소의 하위 12비트는 고정됨
3. 라이브러리와 라이브러리의 함수 간의 offset은 항상 일정
이 있다.
NX (No-eXecute)
NX는 실행에 사용되는 메모리 영역과 쓰기에 사용되는 메모리 영역을 분리하는 보호 기법이다.
CPU가 NX를 지원하면 컴파일러 옵션을 통해 바이너리에 NX를 적용할 수 있다. (-zexecstack 옵션)
NX를 적용하면 스택 영역에 대한 실행 권한이 제한된다.
리눅스 커널 5.4.0 이후 버전은 NX을 적용하지 않아도 스택영역에만 실행 권한을 부여하고, 5.4.0 이전 버전에서는 프로세스의 Personality에 읽기 권한이 있는 모든 페이지에 실행 권한을 부여한다.(READ_IMPLIES_EXEC 플래그)
(NX 적용시 스택 영역에서 실행을 시도할 경우 Segmentation fault 발생)
Library
라이브러리는 쉽게 표현하자면 함수들의 모음이다.
예로 printf, scanf 등등 편리한 함수들을 모아 만든 것이 libc라는 C의 표준 라이브러리이다.
이러한 라이브러리는 컴파일 과정중 링크를 통해 사용할 수 있게 된다.
링크가 되면 코드에서 사용한 라이브러리 함수들의 경로가 지정되어 해당 경로를 통해 함수를 호출한다.
라이브러리는 동적 라이브러리와 정적 라이브러리로 구분되며, 이에 따라 링크도 동적 링크와 정적 링크로 나뉜다.
동적 링크는 run time에 라이브러리를 탐색하며 함수를 호출하고, 정적 링크는 compile time에 라이브러리를 탐색하여 함수를 호출한다.
정적 링크를 좀 더 쉽게 설명하자면 라이브러리를 통째로 바이너리 파일에 포함시키는 것이다.
동적 링크는 run time에 탐색하고 호출하기 때문에 정적 링크에 비해 느리지만, 라이브러리를 바이너리에 포함하지 않으므로 파일의 크기가 훨씬 작다는 이점이 있다.
PLT & GOT
PLT(Procedure Linkage Table)와 GOT(Global offset Table)는 라이브러리에서 동적 링크된 심볼의 주소를 찾을 때 사용하는 테이블이다.
라이브러리 함수를 호출하기 위해서는 해당 함수의 이름을 바탕으로 라이브러리에서 심볼들을 탐색하고, 해당 함수의 정의를 찾아 그 주소로 실행 흐름을 옮겨야 한다.
이 과정을 runtime resolve라고 한다. 특정 함수를 반복적으로 호출할 때 runtime resolve도 반복적으로 이루어 진다면 오버헤드가 크다. 따라서 한 번 호출된 함수의 주소를 GOT에 저장하여 이후에 호출될 때는 runtime resolve를 거치지 않고 GOT에 있는 주소를 사용하여 바로 실행하게 된다.
여기서 라이브러리 함수를 호출할 때 PLT가 사용된다. 즉, 함수를 호출하면 해당 함수의 PLT를 참조하는데 이 PLT에서 GOT가 사용된다. (PLT를 "호출"한다고 이해해도 괜찮을 것 같다.)
우리는 GOT에 저장된 값을 임의로 변경하여 특정 코드를 실행할 수 있다.
이러한 공격 기법을 GOT Overwrite 라고 한다.
'Security > System' 카테고리의 다른 글
| 32bits 아키텍처와 64bits 아키텍처 (0) | 2023.11.15 |
|---|---|
| [System Hacking] Stack Canary (0) | 2023.07.25 |
| [System Hacking] Stack Buffer Overflow (0) | 2023.07.16 |
| [System Hacking] Shellcode (0) | 2023.07.13 |
| [System Hacking] x86 Assembly 명령어 (0) | 2023.02.15 |