ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Memory Mitigation 메모리 보호기법
    CTF/KNOWLEDGE 2021. 1. 19. 02:28

    PRELIMINARY 서론


    시스템해킹을 공부하다 보면 다양한 공격 방법과 이를 방어하기 위한 보호 기법의 변천사에 대해 알 수 있다. 각각의 공격 방법이 성립하는 조건과 원리에 대해 이해하는 것은 매우 중요하며, 이를 알기 위해서는 보호 기법에 대한 이해 또한 필수적이다. pwnable을 하면서 만나게 되는 다양한 보호 기법들과 이에 대한 우회 방법에 대해 정리해보자. 보호 기법이 방지하는 공격 기법들은 붉은색우회 방법은 초록색으로 표기하였다.

    ASLR(Address Space Layout Randomization)


    ASLR 보호기법은 공유 라이브러리, 스택 및 힙이 매핑되는 메모리 영역의 주소를 임의로 배치한다. 그 이유는 공격자가 코드를 작성할 때 payload가 어느 위치에 삽입되야 하는지를 미리 예측할 수 없도록 함으로써 그 가능성을 희박하게 하기 위함이다. [1] 그러나 랜덤으로 배치되는 주소의 규칙성을 탐지하여 공격하는 방식, leak된 address와 offset을 통해 주소를 계산하는 방식 등을 통해 우회할 수 있다.

     

    ASLR은 서버의 설정 파일에 의해 적용 여부가 결정되기 때문에 바이너리를 통해서는 적용 여부를 알 수 없다.

    • 정적 주소를 이용한 공격
    • ASLR bypass brute-force
    • Address Leak
    • Heap Spraying

    ASCII-Armor


    ASCII-Armor는 공유 라이브러리를 매핑할때, 주소값의 상위 1바이트가 0x00이 되게 배치한다. 이렇게 배치할 경우 strcpy나 scanf같이 공백을 무시하는 문자열 관련 함수를 이용해 라이브러리 주소를 읽고 쓰는 것이 불가능해지므로 Return-to-libc처럼 라이브러리 주소를 이용하는 공격이 까다로워지게 된다.

    FORTIFY_SOURCE


    FORTIFY_SOURCE는 strcpy, memset과 같은 메모리 버퍼 관련 함수가 실행될 때, 기존 함수 대신 source와 destination의 크기를 비교하는 방식의 검사를 수행하는 builtin 함수로 대체해서 실행된다. 따라서 SSP와 달리 스택에 할당되지 않은 변수에 대한 오버플로우 검사가 가능하다.

     

    NX bit(No-eXecute bit)


    NX bit(No-eXecute bit)는 실행해야 할 명령어가 존재하는 코드 영역과 데이터가 저장되는 영역의 실행 권한을 분리하고자 도입된 기술이다. NX 특성으로 지정된 메모리 영역은 데이터 저장을 위해서만 사용되므로 buffer overflow를 통한 공격을 어렵게 한다.

    non-executable stack

    PIE(Position Independent Executable)


    PIE는 위치 독립 코드로 이루어진 실행파일을 의미하며, 코드가 매핑된 주소에 상관없이 실행되기 때문에 코드가 매핑되는 메모리 영역이 매번 다르다. 따라서 기존의 절대주소를 바탕으로 plt나 got 영역에 접근해 공격하는 기법이 어려워졌다.

     

    RELRO(Relocation Read-Only)


    Relocation table은 프로그램이 실행되기 위해 어느 부분에 relocation이 필요한지 보관하고 있는 영역으로, 라이브러리 함수의 주소를 담고 있는 .got 등이 이에 해당한다.

     

    RELRO 보호 기법은 Partial RELRO와 Full RELRO로 나뉜다. Partial RELRO는 .dynamic 영역의 쓰기 권한이 존재하지 않고, Full RELRO는 .bss 영역을 제외한 모든 영역의 쓰기 권한이 존재하지 않는다. 따라서 Full RELRO가 적용되었을 경우 got 영역을 변조하는 방식의 공격이 불가능해지지만, 프로세스가 시작될 때 링커에 의해 재배치 작업을 진행하게 되어 실행이 느려지기 때문에 Partial RELRO가 더 많이 사용된다고 한다. [2]

    SSP(Stack Smashing Protector)


    SSP는 스택에 할당된 변수들에 대한 버퍼 오버플로우를 감지하고, 프로그램이 의도하지 않은 방향으로 실행되는 것을 방지한다. SSP가 적용된 바이너리는 함수가 실행될 때 스택에 return address와 saved frame pointer를 차례로 저장한 이후 함수가 시작하기 전 랜덤으로 생성된 canary를 삽입한다. 

    canary at fs:0x28

    함수가 종료될 때 canary가 저장된 위치의 값을 메모리에 저장된 canary와 비교해 값의 변조가 일어났는지 확인한다. 만약 두 값이 다르다면 __stack_chk_fail 함수가 호출되면서 프로그램이 종료되므로 RET 변조를 통한 공격을 방지할 수 있다.

    이를 우회하기 위해서는 스택에 저장된 canary 값을 leak하거나 이를 변조하지 않은 채로 공격을 진행할 필요가 있다.

    Checksec


    checksec

    바이너리에 적용된 보호 기법은 checksec 명령어를 통해 알 수 있다.

     

    Reference

    [1] cpuu.postype.com/post/4077799  

    [2] bpsecblog.wordpress.com/2016/05/18/memory_protect_linux_2/

    'CTF > KNOWLEDGE' 카테고리의 다른 글

    CTF 사이트 만드는 방법 / How to make CTF site  (0) 2021.02.12
    Assembly Language 어셈블리어  (0) 2021.01.14

    댓글

Designed by Tistory.