RootKit [ SSDT Hooking 실습]

2018. 5. 13. 19:25악성코드 분석

SSDT Hooking


SSDT ? System Service Descriptor Table

커널에 존재하는 함수들을 관리하는 테이블

커널 모드 함수들에 대한 포인터를 제공



* 함수 호출 순서

사용자 모드에서 함수 호출 -> kernel32.dll -> 내부적으로 ntdll.dll호출 -> SYSENTER - 커널과 통신 시작

-> 커널의 Hal.dll을 통해서 I/O와 통신한다 ( DeviceDriver )


* SYSTENER ?

EAX, EDX 레지스터를 이용해서 SSDT와 통신한다 ( EAX : 함수 지칭 & EDX : Parameter지정 )

EAX레지스터에는 함수의 주소

EDX레지스터에는 Parameter가 존재하는 사용자모드의 주소



다음은 시스템 프로세스 레코드의 구조 및 SSDT후킹의 원리이다

숨기고자하는 프로세스의 이전 프로세스의 포인터를 변조하여 숨긴다

ZwQuerySystemInformation function - _SYSTEM_PROCESS , _SYSTEM_THREADS structure

_SYSTEM_THREADS structure - NextEntryDelta, CreateTime, UserTime, KernelTime , ...

프로세스들을 리스팅할 때 쓰이는 함수

시스템 프로세스 정보를 버퍼를 통해서 전달


아래 그림은 SSDT후킹의 또다른 예이다 ( 그림은 다르지만 결과는 동일 )

SSDT의 기존 함수의 주소값을 변조하여 기존의 정상파일이 아닌 악성파일을 실행시키도록 할 수도 있다



SSDT후킹에 사용되는 _KSERVICE_DESCRIPTOR_TABLE structure


ServiceTableBase - SSDT

ServiceCounterTableBase 

NumberOfServices

ParamTableBase - Parameter




SSDT Hooking 실습


현재 80번 Port를 열어서 httpd 통신을 수행하고 있다

httpd데몬을 SSDT Hooking을 통해서 숨겨보도록 하자


SSDT후킹의 소스코드의 일부분을 가져왔다

SSDT테이블의 프로세스 중에서 httpd.exe와 일치하는 프로세스를 검사한다

다음 프로세스를 가르키는 구조체 포인터 NextEntryDelta의 값을 한번 더 더해서 다음 프로세스를 가르키도록한다

httpd.exe프로세스를 가르키지 않게되어 SSDT에서 없는 존재가 된다

그리고 다음 프로세스가 없다면 종료되는 코드이다


SSDT후킹 파일을 컴파일해서 .sys파일로 실행가능한 형태로 생성한다


build의 결과로 실행파일과 로그파일 등을 볼 수 있다


InstDrv를 통해서 sys파일을 service로 등록하고 실행시킨다


실행 전과 후의 차이점을 확인하자 ( httpd.exe 파일이 동작하고 있음이 보이지 않는다 )

  =>   


루트킷의 한 종류인 SSDT후킹은 사용하기 편해서 자주 쓰여지는 방법이라고한다

이상으로 SSDT Hooking실습을 마친다



* 요약

1> RootKit의 한 종류인 SSDT Hooking

2> 프로세스명으로 숨기고자 하는 프로세스 검색

3> SSDT에서 해당 프로세스를 가르키는 포인터 변조