ASLR

동글래차·2023년 6월 16일
0

system

목록 보기
3/4

1. ASLR이란?

Address Space Layout Randomization(ASLR)의 약자로 바이너리가 실행될 때마다 
스택, 힙, 공유 라이브러리 등을 임의의 주소에 할당하는 보호 기법    
  • 커널에서 지원하는 보호기법이다.
cat /proc/sys/kernel/randomize_va_space # 명령어로 확인 가능
  • linux에서의 ASLR 값
    • 0: No ASLR(0): ASLR을 적용하지 않음
    • 1: Conservative Randomization(1): 스택, 힙, 라이브러리, vdso 등
    • 2: Conservative Randomization + brk(2): (1)의 영역과 brk로 할당한 영역

2. ASLR 실습

2.1. code

// dreamhack
// Name: addr.c
// Compile: gcc addr.c -o addr -ldl -no-pie -fno-PIE
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
  char buf_stack[0x10];                   // 스택 버퍼
  char *buf_heap = (char *)malloc(0x10);  // 힙 버퍼

  printf("buf_stack addr: %p\n", buf_stack);
  printf("buf_heap addr: %p\n", buf_heap);

  printf("libc_base addr: %p\n",
         *(void **)dlopen("libc.so.6", RTLD_LAZY));  // 라이브러리 주소

  printf("printf addr: %p\n",
         dlsym(dlopen("libc.so.6", RTLD_LAZY),
               "printf"));  // 라이브러리 함수의 주소

  printf("main addr: %p\n", main);  // 코드 영역의 함수 주소
}

2.2. 실행

	master@LAPTOP-MGN8LBMO:~/example/ASLR$ ./addr
	buf_stack addr: 0x7ffc30d09e90
	buf_heap addr: 0xde52a0
	libc_base addr: 0x7f5aa9805000
	printf addr: 0x7f5aa9866c90
	main addr: 0x4011b6

	master@LAPTOP-MGN8LBMO:~/example/ASLR$ ./addr
	buf_stack addr: 0x7ffd7b0d2320
	buf_heap addr: 0x193d2a0
	libc_base addr: 0x7f3dd8ba8000
	printf addr: 0x7f3dd8c09c90
	main addr: 0x4011b6

	master@LAPTOP-MGN8LBMO:~/example/ASLR$ ./addr
	buf_stack addr: 0x7ffcd4cd35e0
	buf_heap addr: 0x1f422a0
	libc_base addr: 0x7f87e81a8000
	printf addr: 0x7f87e8209c90
	main addr: 0x4011b6
  • <main> 함수를 제외한 다른 영역의 주소들은 실행할 때마다 변경됨
  • 바이너리를 반복해서 실행해도 libc_base 주소 하위 12비트 값과 printf 주소 하위 12비트 값은 변경되지 않음
  • libc_base와 printf의 주소 차이는 항상 같음
profile
동글동글

0개의 댓글

관련 채용 정보