혜랑's STORY

[Lazenca] Protection Tech : ASLR, Canaries 본문

2021 SISS 21기 활동/겨울방학 System

[Lazenca] Protection Tech : ASLR, Canaries

hyerang0125 2021. 2. 21. 20:46
본 포스팅은 아래 사이트의 내용을 요약한 것이다.
 

02.ASLR - TechNote - Lazenca.0x0

Excuse the ads! We need some help to keep our site up. List ASLR ASLR(Address Space Layout Randomization)이란? 메모리 손상 취약점 공격을 방지 하기 위한 기술 입니다.스택, 힙, 라이브러리, 등의 주소를 랜덤한 영역에

www.lazenca.net

 

# ASLR(Address Space Layout Randomization)

  • 메모리 손상 취약점 공격을 방지하기 위한 기술로 스택, 힙, 라이브러리 등의 주소를 랜덤한 영역에 배치하여, 공격에 필요한 Target address를 예측하기 어렵게 만든다.]

예) Return-to-libc 공격을 하기 위해서는 공유 라이브러리에서 사용하려는 함수의 주소를 알아야 한다.

-> 주소 값들이 프로그램이 호출될 때마다 고정적인 주소를 가진다면 매우 쉽게 활용할 수 있으나, ASLR의 적용으로 인해 프로그램이 호출될 때마다 스택, 힙, 라이브러리 영역의 주소가 변경되어 공격이 어려워진다.

SET ASLR
cmd
echo 0 > /proc/sys/kernal/randomize_va_space
option
0 >> ASLR 해제
1 >> 랜덤 스택 & 랜덤 라이브러리 설정
2 >> 랜덤 스택 & 랜덤 라이브러리 & 랜덤 힙 설정

 

- 예시

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
char *global = "Lazenca.0x0";
  
int main(){
    char *heap = malloc(100);
    char *stack[] = {"LAZENCA.0x0"};
 
    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;
}

 

-> 이 코드는 힙, 스택, 라이브러리의 주소를 출력한다.  (실습을 진행하는 컴퓨터의 ASLR이 2로 설정되어 있어 0과 1은 웹사이트의 결과를 가져왔다.)

1) echo 0 > /proc/sys/kernel/randomize_va_space 일 때, 힙, 스택, 라이브러리의 주소 영역이 변경되지 않는다.

 

2) echo 1 > /proc/sys/kernel/randomize)va)soace 일 때, 스택과 라이브러리 주소 영역이 변경된다. 

 

3) echo 2 > /proc/sys/kernel/randomize)va)soace 일 때, 힙, 스택과 라이브러리 주소 영역이 변경된다.

예제에서는 .data 영역의 주소는 변경되어 있지 않았다. 해당 영역의 주소도 매번 새로운 주소를 할당하기 위해서는 PIE를 적용해 주어야하는데 내가 실습하는 환경에서는 이미 설정되어 있었는지 .data 영역의 주소 또한 매번 다르게 할당된 것을 확인 할 수 있었다.

 

# Canaries

Cararies/Canary word는 버퍼 오버플로우를 모니터하기 위해 버퍼와 제어 데이터 사이에 설정된 값이다. 버퍼 오버플로우가 발생하면 Canary 값이 손상되고, Canaries 데이터의 검증에 실패하여 오버플로에 대한 경고가 출력되고 손상된 데이터를 무효화 처리한다.

- Types of Canaries

  • Terminator canaries는 Canary의 값을 문자열의 끝을 나타내는 문자들을 이용해 생성한다.
  • NULL(0x00), CR(0x0d), LF(0x0a) 및 EOF(0xff)로 구성되어 있으며, 공격자는 Canaries를 우회하기 위해 Return Address를 쓰기 전에 null 문자를 써야 한다. 그로 인해 오버플로우를 방지할 수 있다. (strcpy는 null 문자의 위치까지 복사한다.) 
  • 이 보호에도 불구하고 공격자는 잠재적으로 Canary를 알려진 값으로 겹쳐쓰고 정보를 틀린 값들로 제어해서 Canary 검사 코드를 통과할 수 있다.

- Random canaries

  • Random canaries는 Canary의 값을 랜덤하게 생성한다. (일반적으로 익스플로잇을 이용해 Canary를 읽는 것은 논리적으로 불가능)
  • 프로그램 초기 설정시에 전역 변수에 Canary 값이 저장된다. 이 값은 보통 매핑되지 않은 페이지에 저장되며, 해당 메모리를 읽으려는 시도를 할 경우 segmentation fault가 발생하고 프로그램이 종료된다.
  • 공격자가 Canary 값이 저장된 stack address를 알거나 스택의 값을 읽어올수 있는 프로그램이 있다면 Canary의 값을 확인 할 수 있다.

- Random XOR canaries

  • Random XOR canaries는 Canary의 값을 모든 제어 데이터 또는 일부를 사용해 XOR-scramble하여 생성한다. 즉,  제어 데이터가 오염되면 Canary의 값이 틀려진다.
  • Random canaries와 동일한 취약점을 가지고 있으나, Canary의 값을 스택에서 읽어오는 방법이 더 복잡하다.
  • 공격자는 canary를 다시 인코딩 하기 위해 Oridinal Canary의 값, 알고리즘, 제어 데이터가 필요하다.