메모리 보호 기법 (ASLR)

c0wb3ll ㅣ 2020. 4. 23. 13:42

메모리 보호 기법 ( ASLR )

메모리 보호 기법 종류

  1. NX Bit ( MS : DEP )
  2. ASLR
  3. Canaries
  4. RELRO
  5. 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의 주소를 모두 실행할 때 마다 바꿔주는 것을 확인할 수 있다.


reference

http://lazenca.net/display/TEC/02.ASLR