ASLR이 걸리게 되면 라이브러리, 힙, 스택 할것없이 모두 주소가 랜덤화된다.
따라서 공격하는 입장에서는 골치아픈 문제인데, 이를 제한적이지만 해제하는 방법이 있다.
이 방법을 사용하기 위해서는 32bit 환경이어야 하며 로컬에 쉘을 가지고 있어야 한다.
"ulimit -s unlimited" 라는 명령을 사용하는 것이 그 방법인데, 이를 사용하면 힙과 스택에 걸린 ASLR을 제외한
라이브러리 등에 걸린 ASLR을 해제해 버릴 수 있다.
왜 그런지 찾아 보았는데,
출처 (http://asked.online/why-ldquoulimit--s-unlimitedrdquo-can-de-aslr-in-overflow/2442975/)
이렇게 나와 있었다.
커널 내부의 mmap.c 파일에 저런 코드가 정의되어 있다는 것인데, 살펴보니 Stack의 Limit가 Infinity이면 1이라는 값을 리턴하는 코드이다.
그 외에는 sysctl_legacy_va_layout을 리턴한다.
그리고 실제로 코드 내부를 확인해 보니 sysctl_legacy_va_layout은 0으로 정의되어 있는 것을 알 수 있다.
sysctl_legacy_va_layout은 아마 가상메모리의 매핑에 관련된 상수라고 생각되는데, 이 내용은
(http://surinderkumar432-tech.blogspot.kr/2007/03/new-virtual-address-space-layout.html)
여기에 나타나 있는 듯 하다.
읽어봐도 잘 알아듣기도 힘들지만 어쨌든 원래라면 0이 리턴되어야 하는 것이 1이 리턴되어 ASLR이 해제된다고 지금은 생각하고 있겠다.
'Knowledge' 카테고리의 다른 글
libcapstone-dev 설치 방법 (0) | 2016.03.12 |
---|---|
PE 파일과 Memory-Mapped File (0) | 2015.12.24 |
Wireshark로 인증서 추출하기 (0) | 2015.11.02 |
RTL Chaining의 원리 (0) | 2015.10.18 |
레지스터 (Register) (0) | 2015.10.12 |