ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Address Space Layout Randomization (ASLR)
    kb 2011. 2. 6. 23:25

    ASLR 기술은 PE 파일이 메모리에 로딩될 때 ImageBase 값을 랜덤하게 바꾸는 것입니다. 

    또한 해당 프로세스의 Stack, Heap 의 시작 주소도 실행될 때마다 랜덤하게 변경됩니다. DLL 파일은 메모리에 최초로 로딩되면서 그 후부터는 다른 프로세스에 매핑되는 개념이기 때문에 같은 DLL 파일에 대해서 프로세스 별로 매핑주소는 동일합니다. 이러한 특성으로 인해 시스템 DLL(ntdll, kernel32.dll 등…) 들은 부팅 시마다 매핑주소는 틀려지겠지만 일단 부팅되면 모든 프로세스에서 같은 주소에 매핑됩니다.

    What is ASLR? In short, when you boot a Windows Vista computer, we load system code into different locations in memory.

    ASLR 기능을 사용하기 위해서는 Windows Vista 이후 운영체제에서만 동작 가능하며 프로그램을 컴파일 할 때 /DYNAMICBASE 옵션을 지정해 주어야 합니다. (VC++ 2008 에서는 기본으로 /DYNAMICBASE 옵션이 켜져 있습니다.)

    이렇게 만들어진 PE 파일에는 “.reloc” 섹션이 추가됩니다. 일반적으로 DLL 일 경우 볼 수 있었던 섹션이지만 /DYNAMICBASE 옵션을 주었을 경우에는 실행파일에서도 추가됩니다. 하지만 “.reloc” 섹션이 필수는 아닙니다. 가장 중요한 것은 아래 두 개의 값입니다.

    IMAGE_FILE_HEADER
      -->Characteristics:IMAGE_FILE_RELOCS_STRIPPED (0x1), 

    IMAGE_OPTIONAL_HEADER
       -->DLL Characteristics:IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE (0x40)

    이러한 기술은 취약점을 이용한 Exploit Code 에 시스템 API 를 사용하기 위한 코드가 존재하는데, 이러한 코드에는 시스템 API 주소를 얻기 위해 고정된 주소를 사용해왔습니다. Microsoft 에서는 이런 불법적인 사용을 막기 위해 실행파일 뿐만 아니라 시스템 DLL 들이 임의의 주소 공간에 위치하도록 하는 기능을 추가한 것입니다.

    This helps defeat a well-understood attack called “retrun-to-libc”, where exploit code attempts to call a system function, such as the socket() function in wsock32.dll to open a socket, or LoadLibrary in kernel32.dll to load wsock32.dll in the first place.

    그러나 이러한 기능이 완전한 것이 아니라는 주장을 어렵지 않게 찾을 수 있습니다.[3] 실제로 32 비트 운영체제에서 8 비트의 주소값을 랜덤하게 선택한다고 해보아야 1/256 확률을 가지게 되고 이 수치는 전수조사 공격 측면에서 불법적인 사용이 실현 가능한 수치로 볼 수 있습니다. 더욱이 어떤 조사에서는 자체 제작한 응용프로그램을 백만번 수행하여 EBP의 값을 확인한 결과 32개의 주소값만을 사용하는 것을 확인되었습니다.[4]

    ASLR 은 현재까지 예측 가능한 DLL 매핑, 주소공간 정보유출, JIT 스프레이 기법들을 통해 우회할 수 있습니다. 따라서 악성코드 제작자들의 ROI 를 높이고자 한다면 DEP (Data Execution Prevention) 를 같이 사용하는 것이 효과적입니다. [2, 3] 

    ASLR 기능을 사용하게 제작되지 않은 응용프로그램에 대해서도 강제적으로 사용할 수 있게 EMET(Exhanced Mitigation Experience Toolkit) 를 사용하는 것도 도움이 될 수 있을 것 같습니다. EMET는 소프트웨어의 취약성이 악용되지 못하도록 도와주는 유틸리티입니다.











    [그림] Process Explorer 를 이용하여 실행중인 프로세스 혹은 라이브러리들의 ASLR 적용여부 확인


    현재 실행중인 프로세스 혹은 라이브러리가 ASLR이 적용되어 실행되었는지 확인해보고 싶을 경우에는 Process Explorer 를 실행하여 ASLR 컬럼을 통해 확인할 수 있다. 적용된 것은 “ASLR” 이라고 나타나며 PE 모듈이 아닌 리소스파일 같은 경우 “n/a” 로 표시된다. 그리고 PE 이면서 ASLR 이 적용되지 않는 경우에는 아무런 표시가 나타나지 않는다.


    참고
    [1] ASLR -
    http://www.reversecore.com/69
    [2] Address Space Layout Randomization in Windows Vista
    http://blogs.msdn.com/b/michael_howard/archive/2006/05/26/address-space-layout-randomization-in-windows-vista.aspx
    [3] On the effectiveness of DEP and ASLR
    http://blogs.technet.com/b/srd/archive/2010/12/08/on-the-effectiveness-of-dep-and-aslr.aspx - (translated in Korean) http://nchovy.kr/forum/2/article/667
    [4] An analysis of Microsoft Windows Vista’s ASLR
    http://sysdream.org/articles/Analysis-of-Microsoft-Windows-Vista%27s-ASLR.pdf


    'kb' 카테고리의 다른 글

    HASH 의 세가지 성질  (0) 2011.04.03
    소수 이야기  (0) 2011.04.03
    Zone Identifier ADS's  (1) 2011.04.03
    Internet Explorer 9 Security  (0) 2011.03.25
    How to debug MBR on the Bochs  (2) 2010.12.27
Designed by Tistory.