NOTICE


=== 목  차 ===



1. 소 개


2. AGENT.EXE

    2.1. FILEENGINE.SYS 파일 생성 및 실행

    2.2. 정상 MBR 데이터 저장

    2.3. DEVICEIOCONTROL로 디바이스와 통신

    2.4. DISKSYSTEM.EXE 파일 생성 및 실행

    2.5. HALC.DLL 파일 실행


3. FILEENGINE.SYS

    3.1. DR0 DEVICEOBJECT 검색

    3.2. MAJORFUNCTION 설정

    3.3. DEVICEIOCONTROL

        3.3.1. 0x222014 Control Code

        3.3.2. 0x222020 Control Code

    3.4. SYSTEM THREAD

    3.5. NT!IOCREATEFILE HOOKING

    3.6. NT!IOCREATEFILE HOOK CODE


4. 악성 MBR (BOOTKIT)

    4.1. BOOTKIT 구현 원리

    4.2. BOOTKIT CODE

    4.3. 증상 및 동작 확인


5. DISKSYSTEM.EXE

    5.1. 서비스 실행

    5.2. SVRMAIN 함수

    5.3. THREAD CODE (HALC.DLL 파일 생성 및 실행)

    5.4. 부록 (서비스 파일 동작 과정)


6. HALC.DLL

    6.1. LPKEXTTEXTIN 함수 코드

        6.1.1. funcXX.tmp 파일 생성

        6.1.2. URL Address 정보 수신

        6.1.3. 악성 파일 URL 수신

        6.1.4. funBA.tmp.exe 파일 실행

    6.2. LPKEDITTEXTOUT 함수 코드


7. 마무리

    7.1. 동작 확인

    7.2. 치 료



1. 소 개

  2011년 9월, 취약한 웹 사이트를 통해 halcbot으로 알려진 악성코드가 유포되었다. 국내 온라인 게임 계정 탈취용으로 제작된 파일이지만 그보다 Rootkit과 Bootkit의 기능을 함께 가지고 있어 이슈가 되었던 샘플이다. 이에 본 문서에서는 Rootkit과 Bootkit을 중점으로 해당 악성파일의 기능을 분석해보도록 한다. [그림 1.1.]은 해당 악성코드의 전체적인 흐름을 보여준다.


[그림 1.1.] 악성코드 동작 과정



2. Agent.exe

 Agent.exe의 상세 분석에 앞서 동작을 간략하게 살펴보면 다음과 같다.


[그림 2.1.] Agent.exe의 동작 과정


2.1. FileEngine.sys 파일 생성 및 실행

 Agnet.exe는 시스템 드라이버 경로에 FileEngine.sys 파일을 생성하고 실행시킨다. 먼저 파일이 생성될 경로를 만드는데 그 과정을 살펴보면 다음과 같다. GetSystemDirectory 함수로 system32 경로를 알아내고 거기에 ‘\drivers\File

Engine.sys’ 문자열을 더한다.


[그림 2.2.] Drop할 파일 경로 생성


 FileEngine.sys 파일 리소스는 Agnet.exe 데이터 영역의 특정 주소에 있다. 파일을 생성할 때 WriteFile 함수를 호출해서 특정 주소의 값을 바로 읽어온다.


[그림 2.3.] FileEngine.sys 파일 생성 과정


 FileEngine.sys의 Drop이 완료되면 해당 파일을 실행 시킨다. FileEngine.sys를 서비스에 등록하고 실행시키는 과정은 아래 [그림 2.4.]와 같다.


[그림 2.4.] 드라이버 파일 등록 및 실행


FileEngine.sys 파일 분석에 대한 내용은 3장에서 자세히 다룬다.


2.2. 정상 MBR 데이터 저장

 BootKit에서 OS가 문제없이 로드되기 위해서는 정상 MBR 코드가 실행되어야 한다. 이를 위해 FileEngine.sys는 Start Sector를 악성 MBR 코드로 덮어쓰기 전에 정상 MBR 코드를 옮겨 놓는다. 사전 작업으로 Agent.exe는 메모리를 할당해서 정상 MBR 데이터를 가져온다.

 먼저 PHYSICALDRIVE0의 오브젝트 핸들을 획득하고 SetFilePointer 함수를 사용해서 커서의 위치를 PHYSICALDRIVE 0의 처음(MBR영역)으로 이동시킨다. 그리고 MBR 0번 Sector의 데이터를 읽는다. 그리고 읽어 들인 데이터는 0x9C 값으로 암호화된다.


[그림 2.5.] 정상 MBR 코드 읽기


2.3. DeviceIoControl로 디바이스와 통신

 Agent.exe는 DeviceIoControl 함수를 사용해 FileEngine.sys와 통신한다. 먼저 디바이스 핸들을 얻고 제어코드를 전송한다.


[그림 2.6.] User Application의 제어코드 전송


 Agent.exe가 FileEngine.sys와 통신할 때 쓰는 인자는 아래 [그림 2.7.]과 같다. 각각 디바이스 핸들, ControlCode, 코드 동작에 필요한 데이터, 데이터 크기 값이 들어간다.


[그림 2.7.] DeviceIoControl 함수


 여기서 코드 동작에 필요한 데이터란, Control Code 0x222014의 경우 Disk Sector에 기록할 악성 MBR 데이터를 의미한다. 각 Control Code에 역할은 아래 [표 2.1.]에 나와있다. 자세한 설명은 ‘3.3. DeviceIoControl’에서 하도록 한다.


[표 2.1.] Control Code의 역할


2.4. DiskSystem.exe 파일 생성 및 실행

 디바이스 통신이 끝나면 system32 경로에 DiskSystem.exe 파일을 생성한다. 기존 파일이 있을 경우 DeleteFile 함수로 삭제하는 과정이 선행된다.


[그림 2.8.] DiskSystem.exe 파일 생성


 DiskSystem.exe는 Agent.exe를 복제한 파일이지만 동작 코드는 다르다. 프로세스 이름을 확인해서 DiskSystem.exe라고 판단되는 경우 서비스로 등록하고 실행시킨다. 그 과정은 아래 [그림 2.9.]와 같다.


[그림 2.9.] DiskSystem.exe 서비스 실행 과정


 서비스 .exe의 동작 원리와 DiskSystem.exe의 상세 동작 분석은 5장에서 다루도록 한다.


※ 본 포스트는 분석 문서 내용의 일부만 담고 있습니다.