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에서 해당 프로세스를 가르키는 포인터 변조
'악성코드 분석' 카테고리의 다른 글
하이브리드 후킹 ( Kernel을 이용한 User IAT 후킹 ) (0) | 2018.05.21 |
---|---|
DeviceDriver MajorFunction 후킹 [ netstat ] (0) | 2018.05.15 |
RootKit [ DeviceDriver 개념 및 설치실습] (0) | 2018.05.13 |
Windows Message Hooking ( 키보드입력 후킹 실습 ) (0) | 2018.05.10 |
Windows Message Hooking ( KeyLogger 실습 ) (0) | 2018.05.10 |