Winkernel 문제 풀기 전 공부한 사항

2018. 5. 4. 03:500x02 Reverse Engineer/0x02. Reversing.kr

728x90

[ 프롤로그 ]

Reversing.kr의 WindowKernel문제 자체의 라이트업은 공개하지 않을것이며, 이 문제를 풀기 위해 사전적으로 

공부했던 내용을 정리하여 올려본다. aka (삽질 && 지식 경험치 쌓기)


WindowKernel 압축 해제 하면 두개의 파일을 획득할 수 있다.


1. WindowKernel.exe

2. Winker.sys 


바이너리를 실행하면 입력조차 할 수가 없다. 


입력을 못하는 대신, 힌트를 떨궈준다.



OpenSCManager에서 에러가 발생하였다고한다.


OpenSCManager함수는 악성코드를 분석할 때 종종 봐왔던 함수이다.

하지만, 이 함수는 비단 악성코드에서만 로드되는 함수는 아니다.

무조건 이게 있다고 오!! 악성코드!! 이러면 안되는 것이다.


여튼 이 함수는 서비스를 등록한 후 서비스를 실행할 때 사용되는 함수라고 보면 된다.

MSDN에서 참고하였다.

SC_HANDLE WINAPI OpenSCManager(
  _In_opt_ LPCTSTR lpMachineName,
  _In_opt_ LPCTSTR lpDatabaseName,
  _In_     DWORD   dwDesiredAccess
);


lpMachineName 인자는 타깃 컴퓨터의 명이 담기게 되는데, 만약 이 부분이 NULL일 경우, 로컬 컴퓨터에 연결되는 컨트롤이라고 보면 된다.


lpDatabaseName 인자는 SERVICES_ACTIVE_DATABASE를 Set해준다.

만약 이 부분이 NULL일 경우, SERVICES_ACTIVE_DATABASE는 디폴트이다.


dwDesiredAccess 인자는 service control manager에 대한 액세스, 액세스 권한 목록을 담당한다.


해당 함수의 반환 값이 null인 경우는 GetLastError를 호출하게 된다.


OpenSCManager는 이정도로만 알고 있으면 될 것 같다.


WindowKernel문제를 푸는 김에 Window의 서비스에 대해서도 공부해보고 싶어졌다. 감사합니다 ~ ^^;; 


그래서 공부했따~ 


우리가 실행하는 서비스들은 svchost.exe에서 호출된다. 

실제로 svchost.exe는 작업관리자를 통해 프로세스를 모니터링해보면 상당히 많다. 


Process Explorer 프로그램이 아닌 윈도우즈에서 기본적으로 제공해주는 작업관리자로 들여다보면 다음과 같다.

svchost는 서비스 호스트와 같은 말임을 알수가 있다.


여담으로, 구글에 이러한 단어를 검색해보면 뭐라고 뜨는지 혹시 아는가?

dll이나 svchost같은 단어를 검색하다보면 종종 바이러스나 악성코드라고 말해주는 사람들이 있다.


나는 1년 전쯤 svchost    .exe 이러한 악성코드를 경험한 적이 있다. 

실제로 요즘 악성코드들은 notepad.exe, hwp.exe, alyac.exe와 같이 피해자들에게 친숙한 이름으로 되어있는 경우가 다수 있다.

그리고 이러한 악성코드들은 속성 값을 보면 정확하게 어떻게 인자를 전달하는지도 알 수 있다.

그렇다면, 이 얘기를 굳이 꺼낸 이유는 무엇일까?


무조건, svchost라고 의심하지는 말되, 서비스 속성을 들여다보고 무슨 값을 인자로 이용하고 있는지를 파악하면 악성코드인지 정상파일인지 분간이 쉬울 것이다.

지나치게 CPU를 점유하고 있어도 의심할 만하다.  


다시 본론으로 돌아가보자. 

sys파일에 대해 공부를 해보고 싶어졌다. 

해당 문제에서 그 파일을 사용하기도 하고.... ^.^



Windows에서 주요한 Win32k.sys파일에 대해 공부를 해보았다.

Win32k.sys파일은 커널 영역 안의 주요파일이다. 

해당 커널 모드 드라이버는 USER와 그래픽 장치 인터페이스(GDI) 서비스를 모두 구현하고 있다.

사용자 애플리케이션은 GDI 제어를 생성하려고 USER루틴을 호출한다. 

GDI는 출력 장치에 표시하기 위해서 랜더링 그래픽에 사용되었다.

다른 운영체제와 달리, 윈도우는 대부분의 GUI 코드를 속도향상을 위해 커널에 포함시켰다.


드라이버의 구조에 대해서도 알아보았다.


드라이버란? 

커널 또는 하드웨어 자원 컨트롤과 상호작용하는 소프트웨어이다.


종류에는 3가지가 있다.

레거시 소프트웨어 드라이버 

Ring0에서 동작하고 문서화 및 문서화되지 않은 인터페이스로 커널과 상호작용하는 소프트웨어이다.

루트킷이나 보안드라이버가 "레거시 소프트웨어 드라이버"에 속한다.


 레거시 필터 드라이버

존재하는 드라이버에 붙어 있고, 입력 값을 수정하는 드라이버


파일 시스템 미니필터 드라이버 

파일 시스템과 상호작용하여 파일 I/O 요청을 가로채는 드라이버.

대부분의 안티 바이러스 소프트웨어는 스캐닝 목적으로 이런 종류의 드라이버를 써서 파일 읽기/쓰기를 가로챈다.


윈도우 드라이버의 표준 모델은 "윈도우 드라이버 모델(WDM)"

WDM은 드라이버가 구현해야 하는 인터페이스와 커널과 더불어 안전하게 상호작용하기 위해 따라야하는 규칙을 정의하고 있다.

전체적인 파워를 관리하면서 신뢰할 수 있는 Plug & Play 하드웨어 드라이버를 작성하는 것과, WDM 인터페이스로 일체의 동기화 성향을 처리하는 것은 어렵다.


이를 극복하기 위해 내세운 것 "윈도우 드라이버 기초(WDF)"

기본적으로 WDF는 WDM 위에 만들어진 일련의 라이브러리로써 개발자가 직접적으로 WDM과 상호작용하는 것을 보호함으로써

드라이버를 쉽게 개발하도록 도와준다고 한다.

WDF는 커널 모드 드라이버 프레임워크(Kernel mode driver framework)와 유저 모드 드라이버 프레임워크(User mode driver framework)로 나뉜다.

KMDF는 커널모드 드라이버 (eg.  IO 장치, USB 장치)

UMDF는 사용자모드 드라이버(eg. 프린터 드라이버)


기억해야 할 것이 있다. 

드라이버는 메인 실행 스레드를 가지고 있지 않고, 단지 특정한 환경에서 커널이 호출할 수 있는 코드를 갖고 있을 뿐이다.


드라이버는 DriverEntry라는 진입지점이 있다.

DLL은 DllEntry가 있듯이 말이다.

구조는 다음과 같다.

DriverEntry : 드라이버 설정 초기화, 필요 시 IRP Dispatch 루틴을 등록

NTSTATUS DriverEntry{

PDRIVER_OBJECT DriverObject,

PUNICODE_STRING RegistryPath

};


DriverObject : I/O 관리자가 드라이버를 로드할 때 채우는 구조체

typedef struct _DRIVER_OBJECT{

CSHORT Type;

CSHORT Size;

PDEVICE_OBJECT DeviceObject;

ULONG Flags;

PVOID DriverStart;

ULONG DriverSize;

PVOID DriverSection;

UNICODE_STRING DriverName;

PUNICODE_STRING HardwareDatabase;

PFAST_IO_DISPATCH FastIoDispatch;

PDRIVER_INITIALIZE DriverInit; // 드라이버 진입 지점 묶음 -> I/O 관리자가 직접 호출하게 됨

PDRIVER_STARTIO DriverStartIo;

PDRIVER_UNLOAD DriverUnload;

PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];

} DRIVER_OBJECT, *PDRIVER_OBJECT;


드라이버가 로드되려면 어떻게 되야 할까?


1. 이미지가 커널 공간 주소에 매핑


2. 드라이버 객체가 만들어 짐


3. 객체 관리자가 등록 됨


4. I/O  관리자가 진입 지점을 호출  



'0x02 Reverse Engineer > 0x02. Reversing.kr' 카테고리의 다른 글

Reversing.kr WindowKernel 상세분석  (0) 2018.05.05
WindowsKernel  (0) 2018.05.05
ImagePrc  (0) 2018.05.04
TWIST 드디어 풀었다.  (0) 2018.02.27
AutoHotKey1  (0) 2018.02.02