메모리 보호 기법 ( ASLR )
메모리 보호 기법 종류
- NX Bit ( MS : DEP )
- ASLR
- Canaries
- RELRO
- PIE
ASLR
- ASLR (Address Space Layout Randomization)이란?
- 메모리 손상 취약점 공격을 방지하기 위한 기술
- 스택, 힙, 라이브러리, 등의 주소를 랜덤한 영역에 배치하여, 공격에 필요한 Target address를 예측하기 어렵게 만듦
- 프로그램이 실행 될 때 마다 각 주소들이 변경됨
- 예를 들어 Return-To-Libc(RTL) 공격을 하기 위해서는 공유 라이브러리에서 사용하려는 함수의 주소를 알아야 한다.
- 이러한 주소 값들이 프로그램이 호출 될 때 마다 고정적인 주소를 가진다면 매우 쉽게 활용할 수 있다.
- 하지만 ASLR의 적용으로 인해 프로그램이 호출 될 때 마다 스택, 힙, 라이브러리 영역의 주소가 변경되면 공격에 어려워진다. (불가능하지는 않다.)
ASLR 설정
echo 0 > /proc/sys/kernel/randomize_va_space
// 0 : ASLR 해제
// 1 : 랜덤 스택 & 랜덤 라이브러리 설정
// 2 : 랜덤 스택 & 랜덤 라이브러리 설정 & 랜덤 힙 설정
실습
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *global = "c0wb3ll";
int main(){
char *heap = malloc(100);
char *stack[] = {"c0wb3ll"};
printf("[Heap] address: %p\n", heap);
printf("[Stack] address: %p\n", stack);
printf("[libc] address: %p\n",**(&stack + 3));
printf("[.data] address: %p\n",global);
gets(heap);
return 0;
}
예제 소스코드이다. heap, stack, libc 의 주소를 출력하는 프로그램이다.
echo 0 > /proc/sys/kernel/randomize_va_space
c0wb3ll@kali:~/Desktop/laz/ASLR$ ./ASLR
[Heap] address: 0x4052a0
[Stack] address: 0x7fffffffe0a0
[libc] address: 0x7ffff7e1be0b
[.data] address: 0x402004
c0wb3ll@kali:~/Desktop/laz/ASLR$ ./ASLR
[Heap] address: 0x4052a0
[Stack] address: 0x7fffffffe0a0
[libc] address: 0x7ffff7e1be0b
[.data] address: 0x402004
c0wb3ll@kali:~/Desktop/laz/ASLR$ ./ASLR
[Heap] address: 0x4052a0
[Stack] address: 0x7fffffffe0a0
[libc] address: 0x7ffff7e1be0b
[.data] address: 0x402004
c0wb3ll@kali:~/Desktop/laz/ASLR$
/proc/sys/kernel/randomize_va_space의 값이 0이면 위와 같이 Heap, Stack, Libc의 주소가 변경되지 않는것을 확인할 수 있다.
echo 1 > /proc/sys/kernel/randomize_va_space
c0wb3ll@kali:~/Desktop/laz/ASLR$ ./ASLR
[Heap] address: 0x4052a0
[Stack] address: 0x7ffd9978df00
[libc] address: 0x7fc63342ee0b
[.data] address: 0x402004
^[[A
c0wb3ll@kali:~/Desktop/laz/ASLR$ ./ASLR
[Heap] address: 0x4052a0
[Stack] address: 0x7ffd0ad3ffa0
[libc] address: 0x7f42a8cf8e0b
[.data] address: 0x402004
c0wb3ll@kali:~/Desktop/laz/ASLR$ ./ASLR
[Heap] address: 0x4052a0
[Stack] address: 0x7fff2ff12ae0
[libc] address: 0x7fc4936eae0b
[.data] address: 0x402004
c0wb3ll@kali:~/Desktop/laz/ASLR$
/proc/sys/kernel/randomize_va_space의 값이 1이면 위와 같이 Stack, Libc의 주소가 변경되는 것을 확인할 수 있다.
echo 2 > /proc/sys/kernel/randomize_va_space
c0wb3ll@kali:~/Desktop/laz/ASLR$ ./ASLR
[Heap] address: 0x5fc2a0
[Stack] address: 0x7ffe507a7f90
[libc] address: 0x7fe7e817be0b
[.data] address: 0x402004
c0wb3ll@kali:~/Desktop/laz/ASLR$ ./ASLR
[Heap] address: 0x1b022a0
[Stack] address: 0x7ffc5abae720
[libc] address: 0x7f044df43e0b
[.data] address: 0x402004
c0wb3ll@kali:~/Desktop/laz/ASLR$ ./ASLR
[Heap] address: 0x20772a0
[Stack] address: 0x7ffd93433950
[libc] address: 0x7fea606d0e0b
[.data] address: 0x402004
c0wb3ll@kali:~/Desktop/laz/ASLR$
Heap,Stack,Libc의 주소를 모두 실행할 때 마다 바꿔주는 것을 확인할 수 있다.