티스토리 뷰

최초 작성일 : 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에서 확인 할 수 있습니다.)

https://github.com/torvalds/linux/blob/097f70b3c4d84ffccca15195bdfde3a37c0a7c0f/arch/x86/include/asm/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\

https://github.com/torvalds/linux/blob/097f70b3c4d84ffccca15195bdfde3a37c0a7c0f/arch/x86/include/asm/elf.h

'Pwnable > System 잡지식' 카테고리의 다른 글

Pwnable 워게임 사이트, 문서 정리  (2) 2015.01.28
ASLR 활성/비활성  (2) 2014.10.04
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함