ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [리버싱 핵심원리 study] 41장 ASLR
    Reverse Engineering 2021. 2. 8. 19:31

    ASLR(Address Space Layout Randomization)은 Windows Vista 이후부터 지원되는 기능으로, PE 파일이 메모리에 로딩될 때 로딩 시작 주소를 랜덤 하게 바꿔주는 기능이다. 이로 인해 프로세스의 스택, 힙의 시작 주소도 랜덤 하게 바뀐다. 모든 실행 파일에 적용되는 기술은 아니며, 아래와 같은 두 가지 조건을 만족해야 한다.

     

    (1) OS의 Kernel Version이 6이상 (Vista 이상)

    (2) 개발 도구에서 /DYNAMICBASE 옵션 지원

     

    위 조건 중 (2)는 Visual C++의 경우 프로젝트 속성의 링커-> 고급 메뉴에서 확인해 볼 수 있다. 만약 ASLR 기능을 원하지 않을 경우 옵션에서 /DYNAMICBASE:NO로 설정해주면 된다.

     

    1. ASLR.exe

    책에서는 다음과 같은 소스코드를 DYNAMICBASE / DYNAMICBASE:NO 옵션으로 각각 빌드한다.

    #include "stdio.h"
    
    void main() {
    	printf("ASLR test program...\n");
    }

     

    두 파일을 각각 OllyDbg로 열어보자.

    - ASLR.exe (DYNAMICBASE 적용)

    ASLR.exe

    - ASLR_no.exe

    ASLR_no.exe

    위와 같이 코드는 같지만 코드가 처음 실행되는 주소가 다른 것을 확인할 수 있다. ASLR이 적용될 경우 파일이 실행될 때마다 랜덤 한 주소의 메모리 주소에 올라가게 된다.

     

    - 섹션 정보

    PEView로 두 파일을 열어보자.

    PEView(1)

    ASLR이 적용된 파일(좌측)의 경우 .reloc 섹션이 하나 추가된 것을 확인할 수 있다.

     

    - IMAGE_FILE_HEADER / Characteristics

    PEView(2)

    ASLR이 적용되지 않은 파일의 경우(하단) IMAGE_FILE_RELOCS_STRIPPED 플래그 값이 IMAGE_FILE_HEADER의 Characteristics 멤버에 추가된다.

     

    - IMAGE_OPTIONAL_HEADER / DLL Characteristics

    PEView(3)

    ASLR이 적용된 파일(상단)에는 DLL Characteristics 멤버에 IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 플래그가 추가된 것을 확인할 수 있다.

     

    2. 실습 - ASLR 기능 제거

    HxD로 파일을 열어서 IMAGE_OPTIONAL_HEADER -> DLL Characteristics의 IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 플래그를 지워주면 간단히 ASLR 기능이 제거된다. 예제 파일에서는 ASLR.exe의 해당 멤버 값이 8140이므로 8100으로 수정해주면 된다.

     

    3. Comment

    예전에 블로그에 글을 쓰기 위해 직접 작성된 코드로 프로그램을 컴파일 하여 몇 번씩 재실행하면서 디버깅하였는데, 그때마다 주소가 바뀌어 곤란했던 기억이 난다. 프로그램을 디버깅할 때 자주 재실행해야 하는 상황에서는 잠시 ASLR기능을 제거하는 것도 좋은 방법인 것 같다.

    반응형

    댓글

Designed by Tistory.