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
'IT 그리고 정보보안 > Knowledge base' 카테고리의 다른 글
스택 가드 (Stack Guard) (0) | 2021.04.15 |
---|---|
스택 쉴드 (Stack Shield) (0) | 2021.04.15 |
Ascii Armor (아스키 아머) (0) | 2021.04.15 |
NX-bit (Non-eXecutable stack) (0) | 2021.04.15 |
argv[] 인자로 받는 페이로드 구성 시 유의할 점 (0) | 2021.04.15 |