Post

(메모리 보호기법) 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

This post is licensed under CC BY 4.0 by the author.