본문 바로가기

System/Windows

System/Hacking/ASLR/ASLR 우회

반응형


ASLR(Address Space Layout Randomization) 기법
 - 방어기법
대부분의 공격은 특정 주소값이 필요하기 때문에 고정적인 주소를 사용하는 공격을 방어 할 수 있다. 하지만 모든 공격을 막을 수는 없다.

# ASLR 적용법
- 컴파일러 옵션에 의해서 적용 여부가 결정
  • 임의 기준 주소 (DYNAMICBASE)옵션 활성화 > 예
  • 프로그램 실행 시 마다 코드 주소 및 스택 주소 등이 모두 변경
가젯들의 주소가 매번 변경되기 때문에 DEP 우회를 위한 ROP 체인을 구성 할 수 없다.

# ASLR 우회 - Bruteforce 공격
- 고정 주소값이 나올 때 까지 동일한 주소 혹은 다양한 주소로 무작위 대입을 시도하는 것.
  • 성공률이 낮다.
    • 한두번의 공격으로 성공해야하는 파일 포맷 기반의 Client 공격에서는 사용 불가.
    • 공격으로 인해 Crash가 발생하며 종료되는 경우 사용 불가.

# ASLR 우회 - Non ASLR 모듈 사용
- 하나의 프로그램안에 ASLR이 적용되지 않은 Non ASLR모듈을 이용.
  • 하지만, EMET도구들을 이용하여 강제 ASLR 적용 가능하긴함.
  • 가장 쉬운 방법
  • Java 등 대부분의 PC에서 사용 중인 공통 모듈, 확장 모듈 등.
    • 최근의 Java 버전에서는 모든 모듈에 ASLR 적용됨.
      • 버전 업데이트가 되지않은 사용자 PC 취약
- 확인 방법
  • immunity debugger에서 mona로확인 가능.
    • !mona modules명령에 ASLR : False를 확인.
- Metasploit ROPDB
  • 많은 PC에서 사용하는 공통 모듈 중 ASLR이 적용되지 않은 모듈들을 이용한 ROP체인 저장.
  • 위치 
    • 기본 경로 : /usr/share/Metasploit-framework/data/ropdb
  • 함수 사용
    • generate_rop_payload()
      • DEP/ASLR 우회 가능

- 공개 Exploit
  • Metasploit
    • 위치 : /Modules/exploits/windows/browser
    • 키워드 :  generate_rop_payload *
    • 찾기 명령 : grep generate_rop_payload *

- Process Explorer로 로드된 모듈 확인
  • 프로그램이 실행 중인 상태에서 Process를 통해 확인
  1. 실행 프로그램을 Open
  2. 실행 프로그램을 클릭하여 하이라이트 시킨 후 Ctrl+L으로 DLL 확인
  3. 혹은 상단 메뉴에 Show Lower Pane를 클릭.
  • View의 Select Columns... 에서 DLL 탭에 ASLR Enabled를 체크해야 아래 탭에 ASLR 옵션 적용 여부가 보여진다.

# ASLR 우회 - 부분 Overwrite
- ASLR이 4바이트의 주소 중 상위 4바이트만 변경되는 것을 이용하는 기법
  • Direct RET Overwrite의 예시
  • 하위 1-3바이트만 변조
    • 기존 리턴 주소가 0x4014A5라면 하위 바이트인 4A5를 ABD로 치환시키고 치환시킨 주소에 해당하는 코드 영역에 Shellcode를 불러오는 명령을 입력한다.

# ASLR 우회 - Info Leak
- 정보를 유출하는 것.
  • 이전부터 존재하던 기법이지만 최근들어 연구가 이루어지면서 ASLR우회기법으로 개발
  • 공격에 필요한 다양한 정보들을 먼저 획득한 뒤 그 정보를 바탕으로 ROP 체인 등을 구성하여 공격하는 기법
  • Info Leak의 예시
    • 자바 스크립트의 substring을 통한 문자열의 중간값 접근
      • 해당 버퍼에 버퍼오버플로우 취약점이 존재한다면 버퍼및 하부 객체의 메모리 구조들의 값을 덮어 쓸 수 있음.
  • 취약점 종류
    • Heap Overflow뿐 아니라 레지스터 값을 Inc, Dec하는 명령을 이용하는 것도 존재.
      • 1 Byte를 Inc하지만 상위 1바이트를 조작하면 0x10000000이 증가하는 효과
    • 문자열 객체의 널바이트를 변조하여 널바이트가 연속해서 두번 나올떄까지 문자열을 인식해버림.
      • 문자열의 끝을 0x00 0x01로 변조시키면 문자열의 끝을 인식하지 못함.
    • Array 객체
      • 배열 특성상 읽기 쓰기가 가능
      • Array 객체의 길이를 나타내는 필드를 조작
- AndvancedInfo Leak
  • Exploit-DB, Pwn2Own 등 공부

# 자바스크립트 문자열 객체
- 자바스크립트 5.8 이하 버전까지는 공통적으로 문자열을 할당할 때 BSTR로 불리는 간단한 문자열 객체를 사용. IE 9버전 이후로 넘어가면서 자바스크립트 DLL 역시 9버전으로 업그레이드 되면서 BSTR객체를 더 이상 사용하지 않음.
- 기존의 BSTR 공격은 어려워짐. 
- 몇가지 기술을 이용해서 BSTR을이용할 수 있고, 새로 추가된 문자열 객체 또한 공격기법이 존재

  • 관련문서
    ROPs_are_for_the_99_CanSecWes_2014.pdf
    Study-of-Exploit-Migitation-in-Modern-Browsers-KEENTeam-XCON2013.pd


반응형