IT 그리고 정보보안/Knowledge base

ASLR (Address Space Layout Randomization)

plummmm 2021. 4. 15. 21:37
반응형

ASLR (Address Space Layout Randomization) 에 대해 함 알아봅시다.

이름에서 보다시피 " 주소 공간 무작위 배치 " 이런 뜻이다. 나는 원래 ASLR이 랜덤 스택을 나타내는 줄 알고 있었는데

Stack, Heap, Memory map allocation Randomization .. 스택 뿐 아니라

메모리에 매핑되는 주소를 모두 무작위 배치하는것.

 

sysctl 명령으로 ASLR을 켰다 껐다 할 수 있다.

 

sysctl -w kernel.randomize_va_space=0

- 0으로 설정하면 ASLR을 끈다.

 

sysctl -w kernel.randomize_va_space=1

- 1로 설정하면 랜덤 스택, 랜덤 라이브러리 켠다.

 

sysctl -w kernel.randomize_va_space=2 

- 2로 설정하면 스택, 힙, 메모리 맵 배치 랜덤 

 

위에 설명한대로 0, 1, 2 값에 따라 설정이 바뀐다.

 

먼저 랜덤 스택을 확인해보자. 다음과 같은 코드로 프로그램을 하나 코딩함.

 

#include <stdio.h>

unsigned int getEBP(void){

        asm("movl %ebp, %eax");

}

 

int main(){

        printf("EBP :%x\n", getEBP());

}

 

​이 녀석을 sysctl 명령에 따라 ebp값을 확인해보면 랜덤스택인지 아닌지 확인할 수 있겠지?

 

root@ubuntu:~# sysctl -w kernel.randomize_va_space=0

kernel.randomize_va_space = 0

root@ubuntu:~# ./aslr_test 

EBP :bffff678

root@ubuntu:~# ./aslr_test 

EBP :bffff678

root@ubuntu:~# ./aslr_test 

EBP :bffff678

root@ubuntu:~# sysctl -w kernel.randomize_va_space=1

kernel.randomize_va_space = 1

root@ubuntu:~# ./aslr_test 

EBP :bfb95498

root@ubuntu:~# ./aslr_test 

EBP :bff033d8

root@ubuntu:~# ./aslr_test 

EBP :bfca68e8

 

보면 알 수 있겠지? 그럼 이제 랜덤 라이브러리, 힙 영역을 확인해봅시다.

root@ubuntu:~# sysctl -w kernel.randomize_va_space=0

kernel.randomize_va_space = 0

root@ubuntu:~# cat /proc/self/maps

08048000-08054000 r-xp 00000000 08:01 786457     /bin/cat

08054000-08055000 r--p 0000b000 08:01 786457     /bin/cat

08055000-08056000 rw-p 0000c000 08:01 786457     /bin/cat

08056000-08077000 rw-p 00000000 00:00 0          [heap]

b7bf4000-b7c16000 rw-p 00000000 00:00 0 

b7c16000-b7e16000 r--p 00000000 08:01 8478       /usr/lib/locale/locale-archive

b7e16000-b7e17000 rw-p 00000000 00:00 0 

b7e17000-b7fbf000 r-xp 00000000 08:01 394319     /lib/i386-linux-gnu/libc-2.19.so

b7fbf000-b7fc1000 r--p 001a8000 08:01 394319     /lib/i386-linux-gnu/libc-2.19.so

b7fc1000-b7fc2000 rw-p 001aa000 08:01 394319     /lib/i386-linux-gnu/libc-2.19.so

b7fc2000-b7fc5000 rw-p 00000000 00:00 0 

b7fd8000-b7fd9000 r--p 00855000 08:01 8478       /usr/lib/locale/locale-archive

b7fd9000-b7fdb000 rw-p 00000000 00:00 0 

b7fdb000-b7fdc000 r-xp 00000000 00:00 0          [vdso]

b7fdc000-b7fde000 r--p 00000000 00:00 0          [vvar]

b7fde000-b7ffe000 r-xp 00000000 08:01 394295     /lib/i386-linux-gnu/ld-2.19.so

b7ffe000-b7fff000 r--p 0001f000 08:01 394295     /lib/i386-linux-gnu/ld-2.19.so

b7fff000-b8000000 rw-p 00020000 08:01 394295     /lib/i386-linux-gnu/ld-2.19.so

bffdf000-c0000000 rw-p 00000000 00:00 0          [stack]

root@ubuntu:~# cat /proc/self/maps

08048000-08054000 r-xp 00000000 08:01 786457     /bin/cat

08054000-08055000 r--p 0000b000 08:01 786457     /bin/cat

08055000-08056000 rw-p 0000c000 08:01 786457     /bin/cat

08056000-08077000 rw-p 00000000 00:00 0          [heap]

b7bf4000-b7c16000 rw-p 00000000 00:00 0 

b7c16000-b7e16000 r--p 00000000 08:01 8478       /usr/lib/locale/locale-archive

b7e16000-b7e17000 rw-p 00000000 00:00 0 

b7e17000-b7fbf000 r-xp 00000000 08:01 394319     /lib/i386-linux-gnu/libc-2.19.so

b7fbf000-b7fc1000 r--p 001a8000 08:01 394319     /lib/i386-linux-gnu/libc-2.19.so

b7fc1000-b7fc2000 rw-p 001aa000 08:01 394319     /lib/i386-linux-gnu/libc-2.19.so

b7fc2000-b7fc5000 rw-p 00000000 00:00 0 

b7fd8000-b7fd9000 r--p 00855000 08:01 8478       /usr/lib/locale/locale-archive

b7fd9000-b7fdb000 rw-p 00000000 00:00 0 

b7fdb000-b7fdc000 r-xp 00000000 00:00 0          [vdso]

b7fdc000-b7fde000 r--p 00000000 00:00 0          [vvar]

b7fde000-b7ffe000 r-xp 00000000 08:01 394295     /lib/i386-linux-gnu/ld-2.19.so

b7ffe000-b7fff000 r--p 0001f000 08:01 394295     /lib/i386-linux-gnu/ld-2.19.so

b7fff000-b8000000 rw-p 00020000 08:01 394295     /lib/i386-linux-gnu/ld-2.19.so

bffdf000-c0000000 rw-p 00000000 00:00 0          [stack]

 

자 이제 ASLR 적용 시키고 나서 다시 한번 확인해보자.

 

​root@ubuntu:~# sysctl -w kernel.randomize_va_space=2

kernel.randomize_va_space = 2

root@ubuntu:~# cat /proc/self/maps

08048000-08054000 r-xp 00000000 08:01 786457     /bin/cat

08054000-08055000 r--p 0000b000 08:01 786457     /bin/cat

08055000-08056000 rw-p 0000c000 08:01 786457     /bin/cat

086e2000-08703000 rw-p 00000000 00:00 0          [heap]

b7352000-b7374000 rw-p 00000000 00:00 0 

b7374000-b7574000 r--p 00000000 08:01 8478       /usr/lib/locale/locale-archive

b7574000-b7575000 rw-p 00000000 00:00 0 

b7575000-b771d000 r-xp 00000000 08:01 394319     /lib/i386-linux-gnu/libc-2.19.so

b771d000-b771f000 r--p 001a8000 08:01 394319     /lib/i386-linux-gnu/libc-2.19.so

b771f000-b7720000 rw-p 001aa000 08:01 394319     /lib/i386-linux-gnu/libc-2.19.so

b7720000-b7723000 rw-p 00000000 00:00 0 

b7736000-b7737000 r--p 00855000 08:01 8478       /usr/lib/locale/locale-archive

b7737000-b7739000 rw-p 00000000 00:00 0 

b7739000-b773a000 r-xp 00000000 00:00 0          [vdso]

b773a000-b773c000 r--p 00000000 00:00 0          [vvar]

b773c000-b775c000 r-xp 00000000 08:01 394295     /lib/i386-linux-gnu/ld-2.19.so

b775c000-b775d000 r--p 0001f000 08:01 394295     /lib/i386-linux-gnu/ld-2.19.so

b775d000-b775e000 rw-p 00020000 08:01 394295     /lib/i386-linux-gnu/ld-2.19.so

bfa71000-bfa92000 rw-p 00000000 00:00 0          [stack]

root@ubuntu:~# cat /proc/self/maps

08048000-08054000 r-xp 00000000 08:01 786457     /bin/cat

08054000-08055000 r--p 0000b000 08:01 786457     /bin/cat

08055000-08056000 rw-p 0000c000 08:01 786457     /bin/cat

0815c000-0817d000 rw-p 00000000 00:00 0          [heap]

b739f000-b73c1000 rw-p 00000000 00:00 0 

b73c1000-b75c1000 r--p 00000000 08:01 8478       /usr/lib/locale/locale-archive

b75c1000-b75c2000 rw-p 00000000 00:00 0 

b75c2000-b776a000 r-xp 00000000 08:01 394319     /lib/i386-linux-gnu/libc-2.19.so

b776a000-b776c000 r--p 001a8000 08:01 394319     /lib/i386-linux-gnu/libc-2.19.so

b776c000-b776d000 rw-p 001aa000 08:01 394319     /lib/i386-linux-gnu/libc-2.19.so

b776d000-b7770000 rw-p 00000000 00:00 0 

b7783000-b7784000 r--p 00855000 08:01 8478       /usr/lib/locale/locale-archive

b7784000-b7786000 rw-p 00000000 00:00 0 

b7786000-b7787000 r-xp 00000000 00:00 0          [vdso]

b7787000-b7789000 r--p 00000000 00:00 0          [vvar]

b7789000-b77a9000 r-xp 00000000 08:01 394295     /lib/i386-linux-gnu/ld-2.19.so

b77a9000-b77aa000 r--p 0001f000 08:01 394295     /lib/i386-linux-gnu/ld-2.19.so

b77aa000-b77ab000 rw-p 00020000 08:01 394295     /lib/i386-linux-gnu/ld-2.19.so

bff22000-bff43000 rw-p 00000000 00:00 0          [stack]

 

힙과 라이브러리 주소들이 랜덤하게 바뀌는 것을 확인할 수 있다.

캡쳐를 할까 했는데.. 너무 길어서 보기도 불편하고 해서 그냥 그대로씀.

 

참고 문서 : Smashing the stack - NewHeart

반응형