profile image

L o a d i n g . . .

article thumbnail image
Published 2021. 3. 11. 14:52

Address Space Layout Randomization(ASLR)라이브러리, 힙, 스택 영역 등의 주소를 바이너리가 실행될 때마다 랜덤하게 바꿔 RTL과 같이 정해진 주소를 이용한 공격을 막기 위한 보호 기법이다.

 

NX bit는 바이너리의 컴파일 옵션에 따라 적용 여부가 결정되었던 것과 달리, ASLR은 서버의 설정 파일에 의해 보호 기법의 적용이 결정된다.

 

Ubuntu 16.04에서는 /proc/sys/kernel/randomize_va_space 파일의 값을 확인하면 서버의 ASLR 설정 여부를 알 수 있다. 설정 파일의 값으로는 0, 1, 2가 있습니다. 각 값은 아래와 같은 의미를 갖는다.

 

0 : ASLR을 적용하지 않음

1 : 스택, 힙 메모리를 랜덤화

2 : 스택, 힙, 라이브러리 메모리를 랜덤화

 

//example3.c
//gcc -o example3 example3.c -m32

#include <stdio.h>
#include <stdlib.h>

int main(void){
  char * buf = (char *)calloc(1, 4096);
  FILE * fp = 0;
  size_t sz = 0;
  
  fp = fopen("/proc/self/maps", "r");
  sz = fread(buf, 1, 4096, fp);
  
  fwrite(buf, 1, sz, stdout);
}

example3.c는 프로세스 자신의 메모리 맵을 읽어 출력해주는 코드이다.

 

다음은 example3의 실행 결과입니다.

첫번째 실행

 

두번째 실행

서버에 ASLR이 켜져있을 때, 라이브러리, , 스택 영역의 주소가 랜덤하게 바뀌는 것을 확인할 수 있다.

라이브러리 주소가 계속 바뀌기 때문에, 스택 버퍼 오버플로우 취약점을 공격할 때 정적 주소를 이용한 공격을 사용할 수 없다.

 

하지만 example3의 실행 결과를 보면 알 수 있듯이, 바이너리 코드 영역의 주소는 변하지 않다. 이를 이용해 ASLR 보호 기법을 우회하여 익스플로잇할 수 있을 것이다.

 

그렇다면 다음 포스팅에는 ASLR을 우회하는 방법에 대해 알아보자!!

 

참고
dreamhack - Linux Exploitation & Mitigation Part 2 
복사했습니다!