ASLR

▶ ASLR

- 메모리 손상 취약점 공격을 방지 하기 위한 기술

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

ex) Retrun to libc 공격을 하기 위해 공유 라이브러리에서 사용하려는 함수의 주소를 알아야 한다. 이러한 주소 값들이 프로그램이 호출 될때 마다 고정적인 주소를 가지면 쉽게 활용할 수 있지만 ASLR의 적용으로 인해 프로그램 호출마다 스택, 힙, 라이브러리 영역의 주소가 변경되면 공격이 어려워진다.

 

< Set ASLR >

 

< Check the protection techniques of binary files >

▶ checksec.sh

- checksec에서 "System-wide ASLR (kernel.randomize_va_space): On (Setting: 2)"라고 출력된다.

 

▶ Memory map

- 메모리 변화 확인하기

  • "/proc/<PID>/maps" 파일을 통해 프로세스의 메모리 구조 및 주소를 확인 할 수 있다.
  • randomize_va_space에 2를 설정한 환경이다.
  • 프로그램을 처음 실행했을 때와 두번째 실행했을 때의 메모리 배치가 다른 것을 확인 할 수 있다.

 

< Example >

▶ Source code

#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;
}

위 코드로 heap, stack, libc의 주소를 출력한다.

 

echo 0 > /proc/sys/kernel/randomize_va_space

- Heap, Stack, Libc의 주소 영역 변경 X

 

▶ echo 1 > /proc/sys/kernel/randomize_va_space

- Stack, Libc의 주소 영역 변경

 

▶ echo 2 > /proc/sys/kernel/randomize_va_space

- Heap, Stack, Libc의 주소 영역 변경

 

▶ .data

- ASLR의 설정을 2로 하였지만 .data 영역의 주소는 변경 X

- 매번 새로운 주소에 할당하기 위해서 PIE를 적용해야 한다.

 

< How to detect ASLR in the "Checksec.sh" file >

- 시스템의 ASLR 설정여부 확인하기

  • "/proc/1/status" 파일 내에 'PaX'단어를 검색하고 검색 결과에서 'R'이 존재하는지 확인한다. 조건을 모두 만족하면 "ASLR enabled"로 판단한다.
  • "/proc/1/status" 파일 내에 'PaX'라는 단어가 없을 경우 'sysctl' 명령어를 통해 출력된 내용 중 "kernel.randomize_va_space ="의 값을 확인해 ASLR 설정을 판단한다.

 

  • 해당 시스템에서는 해당 파일에 "Pax" 정보가 없기 때문에 "/proc/1/status"를 이용해 ASLR이 적용되었는지 확인 할 수 없다. 그래서 'sysctl' 명령어를 이용해 ASLR설정 여부를 판단할 수 있다. 시스템의 설정 값은 '2'이다.

+ Recent posts