ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Linux Memory Protection] - ASLR
    System hacking training/Knowledge 2019. 5. 14. 11:48

    복습겸 리눅스 환경의 메모리 보호 기법에 대해 알아봅시다.

     

    Ref : https://bpsecblog.wordpress.com/2016/05/16/memory_protect_linux_1/

     

    linux 환경에서의 메모리 보호기법을 알아보자(1)

    지금부터 Linux 환경에서의 메모리 보호 기법에 대해 알아봅시다! 이번 편에서는 ASLR, NX, ASCII-Armor, Stack canary에 대해 알아보겠습니다. 위키를 통해 “메모리 보호”라는 말의 정의를 알아보고 넘어갑시다. 실습 환경: CentOS 6.7 (32bit) ASLR : Address Space Layout Randomizati…

    bpsecblog.wordpress.com

    이 글을 토대로 공부한 내용을 포스팅하겠습니다.

     

    • ASLR <- 오늘은 요녀석!
    • DEP(NX)
    • ASCII-Armor
    • Stack Canary

    먼저 ASLR에 대해 알아봅시다.

     

    ASLR(Address Space Layout Randomization) 이란?

    메모리 손상 취약점 공격을 방지 하기 위한 기술입니다.

     

    스택, 힙, 라이브러리 등의 주소를 랜덤한 영역에 배치하여 공격에 필요한 주소값을 예측하기 어렵게 만듭니다.

    이러한 주소값들은 프로그램이 호출될 때 마다 랜덤으로 변경되게 됩니다.

     

    일반적으로 LOB를 풀 때 쉘코드를 스택에 올리고, 해당 스택의 주소를 ret 공간에 배치함으로서 함수가 끝나고 다음 실행할 명령을 쉘코드로 변조하는 공격을 많이 했었는데요.

     

    ASLR이 적용되었다면 프로그램이 실행될 때 마다 쉘코드를 가리키는 스택의 주소 또한 랜덤으로 변경되기 때문에 공격이 어려워집니다.

     

    cat proc/self/maps

    해당 명령을 통해 더 자세히 알아봅시다.

     

    이 명령이 의미하는 부분은 다음과 같은데요.

    • /proc : process의 줄임말, 프로세스의 정보들이 저장된다.
    • /proc/self : 현재 실행되고 있는 프로세스의 정보가 담겨있는 디렉토리
    • /proc/self/maps : 현재 실행되고 있는 프로세스의 주소 맵

    해당 명령을 실행하면 위 그림과 같이 cat에 대한 실제 주소 공간 레이아웃을 볼 수 있습니다.

     

    이제 직접 ASLR이 적용되었을 때, 아닐때를 비교해봅시다.

     

    ASLR에 대한 명령은 다음과 같습니다.

    echo [NUM] > /proc/sys/kernel/randomize_va_space

    [NUM]에 들어가는 값에 따라 ASLR을 해제하거나, 설정할 수 있습니다.

     

    • randomize_va_space = 0 : ASLR 해제
    • randomize_va_space = 1 : 스택, 라이브러리 랜덤화
    • randomize_va_space = 2 : 스택, 라이브러리, 힙 랜덤화

    # ASLR이 적용되었을 때

    주소가 가변적으로 실행할 때 마다 다른 주소를 갖는 것을 확인할 수 있습니다.

    여기서 echo 로 2를 넘겨줬으니, stack, heap, libc 영역을 랜덤화 한 것을 확인할 수 있습니다.

     

    # ASLR이 해제되었을 때

    ASLR이 해제되었을 때는 위 그림과 같이 정적인 주소를 갖고, 실행할때 마다 랜덤화가 되지 않은 것을 확인할 수 있습니다.

     

    마지막으로 간단한 프로그램을 작성하여 확인해봅시다.

    #include <stdio.h>
    
    int a = 10;
    int c;
    
    int main()
    {
        static int b = 20;
        static int d;
    
        char *heap = (char *)malloc(100);
    
        int stack;
    
        printf("    ==========[code section]==========\n");
        printf("    main() addr : 0x%08x\n",&main);
        printf("    ==========[data section]==========\n");
        printf("    valu a addr : 0x%08x\n",&a);
        printf("    valu b addr : 0x%08x\n",&b);
        printf("    ==========[BSS section]==========\n");
        printf("    valu c addr : 0x%08x\n",&c);
        printf("    valu d addr : 0x%08x\n",&d);
        printf("    ==========[heap section]==========\n");
        printf("    [!] heap addr : 0x%08x\n",heap);
        printf("    ==========[stack section]==========\n");
        printf("    [!] stack addr : 0x%08x\n",&stack);
    
        return 0;
    }

    [컴파일 옵션]

    gcc -m32 -no-pie ASLR.c -o ASLR

    저는 ubuntu 18.04 64bit를 사용중이기 때문에 m32옵션으로 32bit 바이너리로 컴파일 했고, 나중에 정리할 내용이지만 PIE라는 녀석 때문에 주소가 랜덤화하는 것을 방지 하기 위해 no-pie 옵션을 줬습니다.

     

    이렇게 컴파일 하고, ASLR이 적용되었을 때와 해제되었을 때를 비교하면 확연하게

    ASLR이라는 메모리 보호기법은 스택, 힙, 라이브러리의 주소를 랜덤화 하는 것을 알 수 있습니다.

     

    이상 포스팅을 마칩니다.

     

    반응형

    'System hacking training > Knowledge' 카테고리의 다른 글

    [Linux Memory Protection] - ASCII-Armor  (0) 2019.05.15
    [Linux Memory Protection] - DEP  (0) 2019.05.14
    What is heap - part 2  (0) 2018.12.21
    What is heap - part1  (2) 2018.12.12
    FPO (Frame Pointer Overflow)  (0) 2018.04.26
Designed by Tistory.