(메모리 보호기법) ASLR, FORTIFY\_SOURCE
ASLR : Address Space Layout Randomization
프로세스의 가상 주소공간에 heap, stack, libc( shared library’s plt ) 등이 mapping될 때 그 위치를 프로그램 실행 시 마다 랜덤하게 변경하는 기법. windows는 vista 이상, linux는 kernel 2.6.12 이상에서 적용.
exploit
fork()
하는 경우 parent의 메모리를 그대로 가져오기 때문에 ASLR이 적용되지 않는다.
서버 프로그램을 재시작하는 경우 ASLR이 적용되어 재시작하기 전과 mapping addr이 달라지게 되므로 주의.
random stack offset만 적용되어 있고 shared library에는 적용되지 않는다면 쉽게 RTL할 수 있으며, shared library에도 적용되어 있다면 프로그램이 종료되기 전에 leak-offset계산-exploit을 모두 수행해야 한다.
enable / disable
1
2
sudo sysctl -w kernel.randomize\_va\_space=values
/proc/sys/kernel/randomize\_va\_space
가 수정된다.
- 0 – No randomization. Everything is static.
- 1 – Conservative randomization.
Shared libraries, mmap(), stack, VDSO and heap
are randomized. - 2 – Full randomization. In addition to elements listed in the previous point, memory managed through
brk()
is also randomized.
permanently disable
1
2
echo kernel.randomize\_va\_space=0 > /etc/sysctl.d/01-disable-aslr.conf
* 파일 이름은 그리 중요하지 않다.
etc disable methods
1
2
3
setarch `arch` -R
`arch` == uname -m
-
arch
대신 bash linux32 | linux64 | i386 | i486 | i586 | i686
를 넣어야 하는 경우가 있음.
- 현재 프로세스(쉘) 및 하위 프로세스에 적용된다.
suid, sgid
가 설정되어 있는 경우 적용되지 않거나, 일부분만 적용된다.
1
2
ulimit -s unlimited
- 현재 프로세스(쉘) 및 하위 프로세스에 적용된다.
- 64bit OS 에서는 동작하지 않는다.
- 내부적으로
setrlimit()
system call을 사용한다. s
옵션은 the maximum stack size를 조정하는 옵션이다.- 부모 프로세스에서 미리
unlimited
가 아닌 값을 기본값으로 설정했을 경우 적용되지 않는다.
windows ASLR, DEP disable
1
2
3
4
IMAGE\_NT\_HEADER - IMAGE\_OPTIONAL\_HEADER - DLL Characteristics
0x0040 : ASLR / 0x0100 : DEP
flag를 0
으로 만들어 주면 해제된다.
FORTIFY_SOURCE
stack BOF를 잡아내는 SSP와 달리 일반적인 메모리 버퍼에서 발생하는 BOF를 잡아내기 위한 보호 기법이다. 동작 방식은 SSP와 꽤나 다르다. 문자열/메모리에 접근하는 함수인 경우 \_\_builtin\_object\_size()
를 이용해 dst의 size check를 수행하도록 한다. open( ,O\_CREATE, mode)
같은 함수는 argument consistency check도 수행한다. 컴파일 타임에 수행하는 check도 있어 컴파일 타임에 알 수 있는 overflow는 잡아낼 수 있다. 그리고, 일반 함수가 검사를 위한 builtin 함수( \_\_func\_chk
)로 변경된다.
1
2
3
4
0x40053f <main+31>: xor eax,eax
=> 0x400541 <main+33>: call 0x400510 <\_\_strcpy\_chk@plt>
0x400546 <main+38>: mov rdi,rsp
/usr/include/x86\_64-linux-gnu/bits/string3.h
를 확인해 보면
1
2
3
4
5
6
7
## undef strcpy
\_\_fortify\_function char \*
\_\_NTH (strcpy (char \*\_\_restrict \_\_dest, const char \*\_\_restrict \_\_src))
{
return \_\_builtin\_\_\_strcpy\_chk (\_\_dest, \_\_src, \_\_bos (\_\_dest));
}
enable
Under Ubuntu FORTIFY_SOURCE is activated when compiled with -O2
or higher. On other Linux distributions (e.g. Fedora or openSUSE) you need to add the compiler flag -D\_FORTIFY\_SOURCE=2