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.1. code
#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의 주소 차이는 항상 같음