티스토리 뷰
최초 작성일 : 2015 - 10 - 24 20:38
최종 주성일 : 2015 - 10 - 24 23:37
주의: 완성된 포스팅이 아닙니다. 사실확인이 되어 있지 않으며 잘못된 정보일 수 있습니다.
root@Ubuntu:~# ldd LIBC_RANDOM
linux-gate.so.1 => (0xb7718000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7540000)
/lib/ld-linux.so.2 (0xb7719000)
root@Ubuntu:~# ldd LIBC_RANDOM
linux-gate.so.1 => (0xb772b000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7553000)
/lib/ld-linux.so.2 (0xb772c000)
root@Ubuntu:~# ldd LIBC_RANDOM
linux-gate.so.1 => (0xb7700000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7528000)
/lib/ld-linux.so.2 (0xb7701000)
위와 같이, 기본적으로 Ubuntu 15.04 버전에서는 ASLR이 적용되어 있다.
하지만 우리가 익히 알고 있듯,
ulimit -s unlimited
명령어를 사용하면 ASLR이 꺼지게 돼있다. 그렇다면 왜 그런지 알아보도록 하자.
reference : http://security.cs.pub.ro/hexcellents/wiki/kb/exploiting/home
Linux/arch/x86/mm/mmap.c에 이 부분에 관하여 정의하고 있다고 한다.
https://github.com/torvalds/linux/blob/master/arch/x86/mm/mmap.c
mmap_is_legacy() 함수를 보면
if (rlimit(RLIMIT_STACK) == RLIM_INFINITY)
return 1;
이런 부분을 볼 수 있다. unlimited 로돼 있으면 return 1;을 해준다.
그리고 같은 파일에서 mmap_is_legacy 함수를 참조하는 다른 함수들을 확인해보자.
*return 1이 실행 안됐을 시에 리턴 해주는 sysctl_legacy_va_layout은 아래 파일에서 0으로 정의 되어 있음
*http://lxr.free-electrons.com/source/include/linux/mm.h
*arch_pick_mmap_layout에서 참조함
mmap_is_legacy 함수를 실행하여 참이면 mm->mmap_base를 mmap_legacy_base()함수를 사용하여
대입해준다. mmap_legacy_base() 함수안에서 32비트인지 확인해주는 코드가 있고
32비트이면 그냥 TASK_UNMAPPED_BASE를 리턴해주고 64비트이면 TASK_UNMAPPED_BASE에 랜덤한 값을 더해준
값을 리턴해준다.
mmap_is_ia32는 32비트인지 확인하는 함수이며, 이부분을 통해 왜 64비트에서는 ASLR이 풀리지 않는지 알 수 있다.
(이 부분은 mmap_legacy_base 함수의 주석부분에서도 확인 할 수 있다.)
/*
* Bottom-up (legacy) layout on X86_32 did not support randomization, X86_64
* does, but not when emulating X86_32
*/
* 수정되었습니다.
(mmap_is_ia32() 함수는 elf.h에서 확인 할 수 있습니다.)
주석으로 보아 32비트이거나 64비트에서 32비트 에뮬레이션일 경우 true를 반환해주는 것 같습니다.
대충 요약해보자면,
1. unlimited인지 mmap_is_legacy() 함수에서 확인함.
2. mmap_is_legacy 함수를 arch_pick_mmap_layout 함수에서 사용하여 참이면 mmap_base를 mmap_legacy_base() 함수를
이용하여 대입해줌
3. mmap_legacy_base() 함수는 32비트인지 64비트인지 확인하고 32비트면 랜덤을 적용하지 않고 base를 설정하고
64비트면 mmap_rnd(); 함수를 통하여 랜덤적용을 해줌.
root@Ubuntu:~# ulimit -s unlimited
root@Ubuntu:~# ldd LIBC_RANDOM
linux-gate.so.1 => (0x40026000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x40042000)
/lib/ld-linux.so.2 (0x40000000)
root@Ubuntu:~# ldd LIBC_RANDOM
linux-gate.so.1 => (0x40026000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x40042000)
/lib/ld-linux.so.2 (0x40000000)
root@Ubuntu:~# ldd LIBC_RANDOM
linux-gate.so.1 => (0x40026000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x40042000)
/lib/ld-linux.so.2 (0x40000000)
REFERENCES
http://security.cs.pub.ro/hexcellents/wiki/kb/exploiting/home
http://lxr.free-electrons.com/source/include/linux/mm.h
https://github.com/torvalds/linux/blob/master/arch/x86/mm/mmap.c\
'Pwnable > System 잡지식' 카테고리의 다른 글
Pwnable 워게임 사이트, 문서 정리 (2) | 2015.01.28 |
---|---|
ASLR 활성/비활성 (2) | 2014.10.04 |