맨위로가기

시스템 서비스 서술자 테이블

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

시스템 서비스 서술자 테이블(SSDT)은 시스템 호출을 커널 함수 주소에 매핑하는 데 사용되는 자료 구조이다. SSDT는 `KSERVICE_DESCRIPTOR_TABLE` 구조체로 구성되며, 시스템 서비스 함수들의 주소를 담고 있는 `nt!_KSYSTEM_SERVICE_TABLE` 구조체의 배열, 각 서비스 호출 횟수를 나타내는 카운터 배열, 서비스 함수 개수, 매개변수 정보를 담은 배열 등을 포함한다. SSDT는 윈도우 커널에서 `KeServiceDescriptorTable`로 노출되며, 최신 윈도우 커널에서는 일반 루틴용과 그래픽 루틴용 두 개의 SSDT가 사용된다. SSDT 후킹은 시스템 호출을 커널 외부 루틴으로 리디렉션하여, 소프트웨어 은폐나 커널 권한 획득에 악용될 수 있으며, 루트킷 및 안티바이러스 소프트웨어에서 사용되기도 한다.

더 읽어볼만한 페이지

  • 윈도우 NT 커널 - 장치 드라이버
    장치 드라이버는 운영 체제와 하드웨어 장치 간 통신을 중재하는 소프트웨어로서, 하드웨어 종류에 상관없이 응용 프로그램이 코드를 작성하도록 추상화를 제공하고, 명령어와 API 호출을 해석하여 장치 제어를 가능하게 하지만 보안 취약점의 대상이 될 수 있다.
  • 윈도우 NT 커널 - 커널 트랜잭션 관리자
    커널 트랜잭션 관리자(KTM)는 커널 모드에서 작동하며, 커널 및 사용자 모드 리소스와 분산 리소스 간의 데이터베이스 트랜잭션을 지원하여 시스템 안정성 향상과 데이터 무결성 보장에 기여한다.
  • 자료 구조 - 라우팅 테이블
    라우팅 테이블은 네트워크에서 데이터 전송 시 최적 경로를 결정하는 핵심 데이터베이스로, 라우터가 목적지 IP 주소를 기반으로 다음 홉을 결정하며 직접 연결 및 원격 네트워크 경로 정보를 저장하고 동적 라우팅 또는 수동 설정으로 관리된다.
  • 자료 구조 - 스택
    스택은 후입선출(LIFO) 원칙에 따라 데이터를 관리하는 추상 자료형으로, push 연산으로 데이터를 쌓고 pop 연산으로 가장 최근 데이터를 제거하며, 서브루틴 호출 관리, 수식 평가, 백트래킹 등에 활용된다.
  • 컴퓨터 보안 - 얼굴 인식 시스템
    얼굴 인식 시스템은 디지털 이미지나 비디오에서 사람 얼굴을 감지하고 식별하는 기술로, 다양한 알고리즘 발전을 거쳐 보안, 신원 확인 등에 활용되지만, 편향성, 개인 정보 침해, 기술적 한계와 같은 윤리적 문제도 야기한다.
  • 컴퓨터 보안 - 워터마크
    워터마크는 종이 제조 시 두께 차이를 이용해 만들어지는 표식으로, 위조 방지를 위해 지폐나 여권 등에 사용되며 댄디 롤 등의 제작 기법을 통해 만들어지고 컴퓨터 프린터 인쇄 기술로도 활용된다.
시스템 서비스 서술자 테이블
기본 정보
유형시스템 서비스 디스크립터 테이블
약칭SSDT
용도윈도우 NT 운영체제 커널의 시스템 서비스 주소 찾기
특징루트킷시스템 호출을 가로채는 데 사용
안티바이러스 소프트웨어 무력화에 사용 가능
기술적 세부 사항
설명시스템 서비스 디스크립터 테이블(SSDT)은 윈도우 NT 운영체제 커널에서 시스템 서비스의 주소를 찾는 데 사용되는 테이블이다.
활용루트킷은 SSDT를 조작하여 시스템 호출을 가로채고 악성 코드를 숨길 수 있다.
보안 취약점SSDT는 루트킷이 운영체제를 손상시키는 데 사용될 수 있는 주요 공격 벡터 중 하나이다.
탐지 및 방어시만텍을 포함한 여러 안티바이러스 회사는 SSDT 변조를 탐지하는 기술을 개발했다.
커널 패치 보호(PatchGuard)와 같은 기술은 SSDT를 무단 수정으로부터 보호하는 데 도움이 된다.
보안 위협
설명공격자는 SSDT를 조작하여 안티바이러스 소프트웨어를 포함한 여러 보안 메커니즘을 우회할 수 있다.
예시2010년에 보고된 한 공격은 SSDT 후킹을 사용하여 대부분의 안티바이러스 소프트웨어를 무력화했다.

2. SSDT의 구조 및 기능

시스템 서비스 서술자 테이블(SSDT)은 윈도우 운영체제 커널의 핵심 구성 요소로, 시스템 호출과 이를 처리하는 커널 함수 간의 연결 다리 역할을 한다. 사용자 공간 응용 프로그램이 시스템 기능을 요청하면, 커널은 SSDT를 참조하여 적절한 커널 함수를 찾아 실행한다. SSDT는 ntoskrnl.exe 모듈 내에 정의되어 있으며, 시스템 작동에 필수적인 매핑 정보를 관리한다. 최신 윈도우 시스템에서는 기본적인 시스템 서비스용 SSDT와 그래픽/UI 관련 서비스용 SSDT, 이렇게 두 종류가 운영되어 시스템 호출의 성격에 따라 적절한 테이블이 사용된다. SSDT의 구체적인 구조와 기능 방식은 하위 섹션에서 더 자세히 다룬다.

2. 1. SSDT 구조

c

typedef struct _KSERVICE_DESCRIPTOR_TABLE

{

PULONG ServiceTableBase; // 시스템 서비스 디스패치 테이블(SSDT)의 기본 주소 포인터

PULONG ServiceCounterTableBase; // 각 서비스 호출 횟수를 추적하는 테이블의 기본 주소 포인터 (디버깅 빌드에서 주로 사용)

ULONG NumberOfServices; // ServiceTableBase 테이블에 있는 서비스의 총 개수

PUCHAR ParamTableBase; // 각 서비스 함수의 파라미터 바이트 수를 담고 있는 테이블의 기본 주소 포인터 (SSPT)

} KSERVICE_DESCRIPTOR_TABLE, *PKSERVICE_DESCRIPTOR_TABLE;

```

SSDT의 포인터는 '''KeServiceDescriptorTable'''이며, ntoskrnl.exe에서 노출된다.

아래는 WinDbg를 사용하여 x86 아키텍처 환경에서 `KeServiceDescriptorTable`(`KiServiceTable`)의 일부 내용을 확인한 예시이다. 각 항목은 시스템 서비스 함수의 이름과 해당 함수의 메모리 주소를 보여준다.

```

lkd> dds KiServiceTable l 191

82ab8d9c 82cb4c28 nt!NtAcceptConnectPort

82ab8da0 82afb40d nt!NtAccessCheck

82ab8da4 82c44b68 nt!NtAccessCheckAndAuditAlarm

82ab8da8 82a5f88a nt!NtAccessCheckByType

82ab8dac 82cb64ff nt!NtAccessCheckByTypeAndAuditAlarm

82ab8db0 82b383fa nt!NtAccessCheckByTypeResultList

82ab8db4 82d26b05 nt!NtAccessCheckByTypeResultListAndAuditAlarm

82ab8db8 82d26b4e nt!NtAccessCheckByTypeResultListAndAuditAlarmByHandle

82ab8dbc 82c393bd nt!NtAddAtom

82ab8dc0 82d40368 nt!NtAddBootEntry

82ab8dc4 82d415c1 nt!NtAddDriverEntry

82ab8dc8 82c2fb95 nt!NtAdjustGroupsToken

82ab8dcc 82cc0b35 nt!NtAdjustPrivilegesToken

82ab8dd0 82d19963 nt!NtAlertResumeThread

82ab8dd4 82c6ca56 nt!NtAlertThread

82ab8dd8 82c3c6cc nt!NtAllocateLocallyUniqueId

82ab8ddc 82bd2928 nt!NtAllocateReserveObject

82ab8de0 82d0b898 nt!NtAllocateUserPhysicalPages

82ab8de4 82c2314e nt!NtAllocateUuids

82ab8de8 82c65a62 nt!NtAllocateVirtualMemory

82ab8dec 82cb1df1 nt!NtAlpcAcceptConnectPort

82ab8df0 82c13238 nt!NtAlpcCancelMessage

82ab8df4 82cb11fe nt!NtAlpcConnectPort

82ab8df8 82c30c0c nt!NtAlpcCreatePort

82ab8dfc 82cc25bc nt!NtAlpcCreatePortSection

82ab8e00 82c3328f nt!NtAlpcCreateResourceReserve

82ab8e04 82cc239c nt!NtAlpcCreateSectionView

82ab8e08 82cbaafc nt!NtAlpcCreateSecurityContext

82ab8e0c 82c450f0 nt!NtAlpcDeletePortSection

82ab8e10 82d06657 nt!NtAlpcDeleteResourceReserve

82ab8e14 82cb7ec9 nt!NtAlpcDeleteSectionView

82ab8e18 82cc27ee nt!NtAlpcDeleteSecurityContext

82ab8e1c 82c9b1fc nt!NtAlpcDisconnectPort

82ab8e20 82cb5f2e nt!NtAlpcImpersonateClientOfPort

82ab8e24 82c47d15 nt!NtAlpcOpenSenderProcess

82ab8e28 82c3bcf3 nt!NtAlpcOpenSenderThread

82ab8e2c 82c2db70 nt!NtAlpcQueryInformation

82ab8e30 82c9ba83 nt!NtAlpcQueryInformationMessage

82ab8e34 82d0677f nt!NtAlpcRevokeSecurityContext

82ab8e38 82c8df0a nt!NtAlpcSendWaitReceivePort

82ab8e3c 82c3b702 nt!NtAlpcSetInformation

82ab8e40 82c4d21b nt!NtApphelpCacheControl

82ab8e44 82c090e3 nt!NtAreMappedFilesTheSame

82ab8e48 82c3aed1 nt!NtAssignProcessToJobObject

82ab8e4c 82ab98bc nt!NtCallbackReturn

82ab8e50 82c045c3 nt!NtCancelIoFile

82ab8e54 82c38ce7 nt!NtCancelIoFileEx

82ab8e58 82cf2fb0 nt!NtCancelSynchronousIoFile

82ab8e5c 82a65d56 nt!NtCancelTimer

82ab8e60 82c67b5f nt!NtClearEvent

82ab8e64 82c8037a nt!NtClose

82ab8e68 82cb642e nt!NtCloseObjectAuditAlarm

82ab8e6c 82d2e412 nt!NtCommitComplete

82ab8e70 82d2e132 nt!NtCommitEnlistment

82ab8e74 82c0f9b9 nt!NtCommitTransaction

82ab8e78 82cd8013 nt!NtCompactKeys

82ab8e7c 82c36c9d nt!NtCompareTokens

82ab8e80 82c3bce9 nt!NtCompleteConnectPort

82ab8e84 82cd827f nt!NtCompressKey

82ab8e88 82cb3d09 nt!NtConnectPort

82ab8e8c 82a7bd0c nt!NtContinue

82ab8e90 82ce8c79 nt!NtCreateDebugObject

82ab8e94 82c3e505 nt!NtCreateDirectoryObject

82ab8e98 82be0a55 nt!NtCreateEnlistment

82ab8e9c 82c7c671 nt!NtCreateEvent

82ab8ea0 82d46068 nt!NtCreateEventPair

82ab8ea4 82c8b1e4 nt!NtCreateFile

82ab8ea8 82c96667 nt!NtCreateIoCompletion

82ab8eac 82c2d977 nt!NtCreateJobObject

82ab8eb0 82d1b6de nt!NtCreateJobSet

82ab8eb4 82c3ce2a nt!NtCreateKey

82ab8eb8 82c4bd1e nt!NtCreateKeyedEvent

82ab8ebc 82c0da36 nt!NtCreateKeyTransacted

82ab8ec0 82c4132f nt!NtCreateMailslotFile

82ab8ec4 82c4c196 nt!NtCreateMutant

82ab8ec8 82cbc4f9 nt!NtCreateNamedPipeFile

82ab8ecc 82bc8406 nt!NtCreatePagingFile

82ab8ed0 82c2d75f nt!NtCreatePort

82ab8ed4 82c0f57f nt!NtCreatePrivateNamespace

82ab8ed8 82d17df9 nt!NtCreateProcess

82ab8edc 82d17e44 nt!NtCreateProcessEx

82ab8ee0 82d46afb nt!NtCreateProfile

82ab8ee4 82d46ac1 nt!NtCreateProfileEx

82ab8ee8 82be335f nt!NtCreateResourceManager

82ab8eec 82c5ef2b nt!NtCreateSection

82ab8ef0 82c4198d nt!NtCreateSemaphore

82ab8ef4 82c3d7f5 nt!NtCreateSymbolicLinkObject

82ab8ef8 82d17c02 nt!NtCreateThread

82ab8efc 82cac124 nt!NtCreateThreadEx

82ab8f00 82c3a304 nt!NtCreateTimer

82ab8f04 82c40ac8 nt!NtCreateToken

82ab8f08 82c0be62 nt!NtCreateTransaction

82ab8f0c 82be316b nt!NtCreateTransactionManager

82ab8f10 82caa056 nt!NtCreateUserProcess

82ab8f14 82be0134 nt!NtCreateWaitablePort

82ab8f18 82c4bf39 nt!NtCreateWorkerFactory

82ab8f1c 82ce9b36 nt!NtDebugActiveProcess

82ab8f20 82cea1f3 nt!NtDebugContinue

82ab8f24 82c6496f nt!NtDelayExecution

82ab8f28 82c2807b nt!NtDeleteAtom

82ab8f2c 82d4039b nt!NtDeleteBootEntry

82ab8f30 82d415f3 nt!NtDeleteDriverEntry

82ab8f34 82bd46ad nt!NtDeleteFile

82ab8f38 82c27911 nt!NtDeleteKey

82ab8f3c 82cc69df nt!NtDeleteObjectAuditAlarm

82ab8f40 82ccf6f6 nt!NtDeletePrivateNamespace

82ab8f44 82c19328 nt!NtDeleteValueKey

82ab8f48 82caf3ca nt!NtDeviceIoControlFile

82ab8f4c 82d034da nt!NtDisableLastKnownGood

82ab8f50 82d3e5ef nt!NtDisplayString

82ab8f54 82b4f259 nt!NtDrawText

82ab8f58 82c6d4f0 nt!NtDuplicateObject

82ab8f5c 82ca7974 nt!NtDuplicateToken

82ab8f60 82d035bb nt!NtEnableLastKnownGood

82ab8f64 82d4059d nt!NtEnumerateBootEntries

82ab8f68 82d417f3 nt!NtEnumerateDriverEntries

82ab8f6c 82ca2a59 nt!NtEnumerateKey

82ab8f70 82d4017b nt!NtEnumerateSystemEnvironmentValuesEx

82ab8f74 82d2ef4c nt!NtEnumerateTransactionObject

82ab8f78 82ca4ebf nt!NtEnumerateValueKey

82ab8f7c 82d09a0f nt!NtExtendSection

82ab8f80 82c20d81 nt!NtFilterToken

82ab8f84 82c2c8ff nt!NtFindAtom

82ab8f88 82c44117 nt!NtFlushBuffersFile

82ab8f8c 82bd090f nt!NtFlushInstallUILanguage

82ab8f90 82c3b4c2 nt!NtFlushInstructionCache

82ab8f94 82c1a9cd nt!NtFlushKey

82ab8f98 82a601b1 nt!NtFlushProcessWriteBuffers

82ab8f9c 82c16130 nt!NtFlushVirtualMemory

82ab8fa0 82d0c9b7 nt!NtFlushWriteBuffer

82ab8fa4 82d0c039 nt!NtFreeUserPhysicalPages

82ab8fa8 82af44db nt!NtFreeVirtualMemory

82ab8fac 82b0e6fc nt!NtFreezeRegistry

82ab8fb0 82d2f39a nt!NtFreezeTransactions

82ab8fb4 82c916a2 nt!NtFsControlFile

82ab8fb8 82cd0dc1 nt!NtGetContextThread

82ab8fbc 82cd0d56 nt!NtGetCurrentProcessorNumber

82ab8fc0 82d14e37 nt!NtGetDevicePowerState

82ab8fc4 82c4cdaf nt!NtGetMUIRegistryInfo

82ab8fc8 82d19b54 nt!NtGetNextProcess

82ab8fcc 82cc8c0a nt!NtGetNextThread

82ab8fd0 82c155c6 nt!NtGetNlsSectionPtr

82ab8fd4 82d2f4f4 nt!NtGetNotificationResourceManager

82ab8fd8 82bfae67 nt!NtGetPlugPlayEvent

82ab8fdc 82b255c7 nt!NtGetWriteWatch

82ab8fe0 82c317ca nt!NtImpersonateAnonymousToken

82ab8fe4 82d057a1 nt!NtImpersonateClientOfPort

82ab8fe8 82cb55fc nt!NtImpersonateThread

82ab8fec 82c97f0d nt!NtInitializeNlsFiles

82ab8ff0 82bd41ca nt!NtInitializeRegistry

82ab8ff4 82ccb5c3 nt!NtInitiatePowerAction

82ab8ff8 82ccccdd nt!NtIsProcessInJob

82ab8ffc 82d14e1e nt!NtIsSystemResumeAutomatic

82ab9000 82bcede9 nt!NtIsUILanguageComitted

82ab9004 82bcbc75 nt!NtListenPort

82ab9008 82c01b78 nt!NtLoadDriver

82ab900c 82bcd426 nt!NtLoadKey

82ab9010 82bbaa1c nt!NtLoadKey2

82ab9014 82bdde72 nt!NtLoadKeyEx

82ab9018 82c3f32b nt!NtLockFile

82ab901c 82bb4026 nt!NtLockProductActivationKeys

82ab9020 82baf6d5 nt!NtLockRegistryKey

82ab9024 82a5f191 nt!NtLockVirtualMemory

82ab9028 82c021b1 nt!NtMakePermanentObject

82ab902c 82c47851 nt!NtMakeTemporaryObject

82ab9030 82c4c35b nt!NtMapCMFModule

82ab9034 82d0ab57 nt!NtMapUserPhysicalPages

82ab9038 82d0b12d nt!NtMapUserPhysicalPagesScatter

82ab903c 82c82394 nt!NtMapViewOfSection

82ab9040 82d4056c nt!NtModifyBootEntry

82ab9044 82d417c4 nt!NtModifyDriverEntry

82ab9048 82c31db6 nt!NtNotifyChangeDirectoryFile

82ab904c 82c35e17 nt!NtNotifyChangeKey

82ab9050 82c34f39 nt!NtNotifyChangeMultipleKeys

82ab9054 82bfbd6b nt!NtNotifyChangeSession

82ab9058 82c7e584 nt!NtOpenDirectoryObject

82ab905c 82d2d995 nt!NtOpenEnlistment

82ab9060 82c4bb92 nt!NtOpenEvent

82ab9064 82d46169 nt!NtOpenEventPair

82ab9068 82c6db10 nt!NtOpenFile

82ab906c 82cf2ca5 nt!NtOpenIoCompletion

82ab9070 82d1b057 nt!NtOpenJobObject

82ab9074 82c87642 nt!NtOpenKey

82ab9078 82c4badd nt!NtOpenKeyEx

82ab907c 82d4649f nt!NtOpenKeyedEvent

82ab9080 82c0b169 nt!NtOpenKeyTransacted

82ab9084 82c0b0f9 nt!NtOpenKeyTransactedEx

82ab9088 82c9d0e2 nt!NtOpenMutant

82ab908c 82c144b2 nt!NtOpenObjectAuditAlarm

82ab9090 82c15f07 nt!NtOpenPrivateNamespace

82ab9094 82c4d9dc nt!NtOpenProcess

82ab9098 82c9ffff nt!NtOpenProcessToken

82ab909c 82c8db37 nt!NtOpenProcessTokenEx

82ab90a0 82bb90c7 nt!NtOpenResourceManager

82ab90a4 82ca5674 nt!NtOpenSection

82ab90a8 82c210c6 nt!NtOpenSemaphore

82ab90ac 82cc2977 nt!NtOpenSession

82ab90b0 82c89b6f nt!NtOpenSymbolicLinkObject

82ab90b4 82c99d87 nt!NtOpenThread

82ab90b8 82cb42e4 nt!NtOpenThreadToken

82ab90bc 82c8dc4e nt!NtOpenThreadTokenEx

82ab90c0 82d45e0f nt!NtOpenTimer

82ab90c4 82d2e6f1 nt!NtOpenTransaction

82ab90c8 82d2f989 nt!NtOpenTransactionManager

82ab90cc 82c1f506 nt!NtPlugPlayControl

82ab90d0 82c7c970 nt!NtPowerInformation

82ab90d4 82d2e2a2 nt!NtPrepareComplete

82ab90d8 82d2dfc2 nt!NtPrepareEnlistment

82ab90dc 82d2e35a nt!NtPrePrepareComplete

82ab90e0 82d2e07a nt!NtPrePrepareEnlistment

82ab90e4 82c3293f nt!NtPrivilegeCheck

82ab90e8 82c01f60 nt!NtPrivilegedServiceAuditAlarm

82ab90ec 82c1ca51 nt!NtPrivilegeObjectAuditAlarm

82ab90f0 82d300e4 nt!NtPropagationComplete

82ab90f4 82d301aa nt!NtPropagationFailed

82ab90f8 82c7e403 nt!NtProtectVirtualMemory

82ab90fc 82ccf5a7 nt!NtPulseEvent

82ab9100 82c939a1 nt!NtQueryAttributesFile

82ab9104 82d40a3e nt!NtQueryBootEntryOrder

82ab9108 82d40e83 nt!NtQueryBootOptions

82ab910c 82afed34 nt!NtQueryDebugFilterState

82ab9110 82cb2b8c nt!NtQueryDefaultLocale

82ab9114 82bdef5c nt!NtQueryDefaultUILanguage

82ab9118 82c6fd11 nt!NtQueryDirectoryFile

82ab911c 82c949f0 nt!NtQueryDirectoryObject

82ab9120 82d41381 nt!NtQueryDriverEntryOrder

82ab9124 82bcdb4a nt!NtQueryEaFile

82ab9128 82c3681e nt!NtQueryEvent

82ab912c 82cbc5d5 nt!NtQueryFullAttributesFile

82ab9130 82c2824c nt!NtQueryInformationAtom

82ab9134 82d2dba2 nt!NtQueryInformationEnlistment

82ab9138 82c916d5 nt!NtQueryInformationFile

82ab913c 82cc80ff nt!NtQueryInformationJobObject

82ab9140 82d057d4 nt!NtQueryInformationPort

82ab9144 82c72644 nt!NtQueryInformationProcess

82ab9148 82d2f5fe nt!NtQueryInformationResourceManager

82ab914c 82c98d6d nt!NtQueryInformationThread

82ab9150 82c8e06e nt!NtQueryInformationToken

82ab9154 82d2e8e4 nt!NtQueryInformationTransaction

82ab9158 82bb8bcf nt!NtQueryInformationTransactionManager

82ab915c 82b4fe81 nt!NtQueryInformationWorkerFactory

82ab9160 82c1ac3f nt!NtQueryInstallUILanguage

82ab9164 82d46e6b nt!NtQueryIntervalProfile

82ab9168 82cf2d68 nt!NtQueryIoCompletion

82ab916c 82c87cae nt!NtQueryKey

82ab9170 82c3de8d nt!NtQueryLicenseValue

82ab9174 82c1ccc0 nt!NtQueryMultipleValueKey

82ab9178 82d4657c nt!NtQueryMutant

82ab917c 82c3ced6 nt!NtQueryObject

82ab9180 82cd7b05 nt!NtQueryOpenSubKeys

82ab9184 82cc5df8 nt!NtQueryOpenSubKeysEx

82ab9188 82c4c277 nt!NtQueryPerformanceCounter

82ab918c 82d182c4 nt!NtQueryPortInformationProcess

82ab9190 82cf4349 nt!NtQueryQuotaInformationFile

82ab9194 82cb29e6 nt!NtQuerySection

82ab9198 82c322d0 nt!NtQuerySecurityAttributesToken

82ab919c 82c35e4c nt!NtQuerySecurityObject

82ab91a0 82d3f3fc nt!NtQuerySemaphore

82ab91a4 82c89c15 nt!NtQuerySymbolicLinkObject

82ab91a8 82d3f5d3 nt!NtQuerySystemEnvironmentValue

82ab91ac 82d3fbc7 nt!NtQuerySystemEnvironmentValueEx

82ab91b0 82c6bcd4 nt!NtQuerySystemInformation

82ab91b4 82ca4ddd nt!NtQuerySystemInformationEx

82ab91b8 82cb2af7 nt!NtQuerySystemTime

82ab91bc 82d45ece nt!NtQueryTimer

82ab91c0 82c28729 nt!NtQueryTimerResolution

82ab91c4 82c86405 nt!NtQueryValueKey

82ab91c8 82c976a7 nt!NtQueryVirtualMemory

82ab91cc 82c922c8 nt!NtQueryVolumeInformationFile

82ab91d0 82c37caa nt!NtQueueApcThread

82ab91d4 82c33e67 nt!NtQueueApcThreadEx

82ab91d8 82a7bd54 nt!NtRaiseException

82ab91dc 82c130a3 nt!NtRaiseHardError

82ab91e0 82c9dc8c nt!NtReadFile

82ab91e4 82bd36a7 nt!NtReadFileScatter

82ab91e8 82d2e580 nt!NtReadOnlyEnlistment

82ab91ec 82d058b9 nt!NtReadRequestData

82ab91f0 82c9b82c nt!NtReadVirtualMemory

82ab91f4 82d2db46 nt!NtRecoverEnlistment

82ab91f8 82be388c nt!NtRecoverResourceManager

82ab91fc 82be5128 nt!NtRecoverTransactionManager

82ab9200 82d2ff38 nt!NtRegisterProtocolAddressInformation

82ab9204 82d1909c nt!NtRegisterThreadTerminatePort

82ab9208 82c6c0ed nt!NtReleaseKeyedEvent

82ab920c 82c64873 nt!NtReleaseMutant

82ab9210 82c4eb6a nt!NtReleaseSemaphore

82ab9214 82abec28 nt!NtReleaseWorkerFactoryWorker

82ab9218 82c41a8e nt!NtRemoveIoCompletion

82ab921c 82c3ca8e nt!NtRemoveIoCompletionEx

82ab9220 82ce9c81 nt!NtRemoveProcessDebug

82ab9224 82cd7d4b nt!NtRenameKey

82ab9228 82d2fbd4 nt!NtRenameTransactionManager

82ab922c 82cd7898 nt!NtReplaceKey

82ab9230 82b173d3 nt!NtReplacePartitionUnit

82ab9234 82c2ca3d nt!NtReplyPort

82ab9238 82c745e2 nt!NtReplyWaitReceivePort

82ab923c 82c74165 nt!NtReplyWaitReceivePortEx

82ab9240 82d05a85 nt!NtReplyWaitReplyPort

82ab9244 82cbc435 nt!NtRequestPort

82ab9248 82c798d9 nt!NtRequestWaitReplyPort

82ab924c 82c17ec3 nt!NtResetEvent

82ab9250 82b25c18 nt!NtResetWriteWatch

82ab9254 82ccd904 nt!NtRestoreKey

82ab9258 82d198fd nt!NtResumeProcess

82ab925c 82cac34b nt!NtResumeThread

82ab9260 82d2e636 nt!NtRollbackComplete

82ab9264 82d2e1ea nt!NtRollbackEnlistment

82ab9268 82be1c7c nt!NtRollbackTransaction

82ab926c 82d2fd36 nt!NtRollforwardTransactionManager

82ab9270 82ccf176 nt!NtSaveKey

82ab9274 82cce91c nt!NtSaveKeyEx

82ab9278 82cd6bbb nt!NtSaveMergedKeys

82ab927c 82c99dbc nt!NtSecureConnectPort

82ab9280 82bc6f07 nt!NtSerializeBoot

82ab9284 82d40c7f nt!NtSetBootEntryOrder

82ab9288 82d4116b nt!NtSetBootOptions

82ab928c 82d18cff nt!NtSetContextThread

82

2. 2. SSDT의 기능

SSDT는 시스템 호출을 커널 함수의 주소와 연결하는 역할을 한다.

사용자 공간 응용 프로그램에서 시스템 호출이 발생하면, 어떤 시스템 호출이 실행되는지를 나타내는 서비스 인덱스가 매개변수로 함께 전달된다. SSDT는 이 서비스 인덱스를 이용하여 ntoskrnl.exe 내부에 있는 해당 함수의 주소를 찾아낸다.

최신 윈도우 커널에서는 두 개의 SSDT가 사용된다. 하나는 일반적인 시스템 루틴을 처리하는 'KeServiceDescriptorTable'이고, 다른 하나는 그래픽 관련 루틴을 처리하는 'KeServiceDescriptorTableShadow'이다. 어떤 SSDT를 사용할지는 시스템 호출을 하는 사용자 공간 응용 프로그램에서 전달하는 매개변수에 따라 결정된다.

3. SSDT 후킹 (Hooking)

SSDT 후킹은 시스템 서비스 서술자 테이블(SSDT)을 수정하여 시스템 호출의 실행 경로를 변경하는 기술이다. 이를 통해 커널 외부의 코드를 실행시킬 수 있으며, 주로 윈도우 커널 모드 루트킷이나 안티바이러스 소프트웨어 등에서 사용된다.[1][2] 2010년에는 이 기술을 사용하는 일부 보안 제품들이 경쟁 조건을 이용한 익스플로잇에 취약하다는 점이 발견되기도 했다.[2]

3. 1. SSDT 후킹의 위험성

SSDT(시스템 서비스 서술자 테이블)를 수정하면 시스템 호출을 커널 외부의 다른 프로그램(루틴)으로 리다이렉션할 수 있다. 이렇게 연결된 프로그램은 악성 소프트웨어의 존재를 숨기거나, 공격자가 커널 권한으로 시스템을 지속적으로 제어할 수 있는 백도어 역할을 할 수 있다. 이러한 특성 때문에, SSDT 호출 후킹은 윈도우 커널 모드 루트킷과 안티바이러스 소프트웨어 양쪽에서 자주 사용되는 기술이다.[1][2]

하지만 2010년에는 SSDT 호출 후킹 기술을 사용하는 많은 컴퓨터 보안 제품들이 익스플로잇 공격에 취약하다는 사실이 밝혀졌다. 공격자들은 경쟁 조건을 이용하여 보안 제품의 검사를 무력화시키는 방식으로 공격했다.[2]

3. 2. 대한민국에서의 SSDT 후킹 대응

SSDT(시스템 서비스 서술자 테이블)를 수정하면 시스템 호출을 커널 외부의 특정 프로그램 코드(루틴)로 연결 경로를 변경(리디렉션)할 수 있다. 이러한 외부 루틴은 특정 소프트웨어가 시스템에서 실행 중인 사실을 숨기거나, 공격자가 커널 수준의 높은 권한으로 시스템에 백도어를 설치하여 지속적으로 코드를 실행할 수 있게 하는 통로로 악용될 수 있다. 이러한 특성 때문에 SSDT 호출 후킹 기술은 윈도우 운영체제 환경에서 활동하는 커널 모드 루트킷이나, 반대로 이를 탐지하고 방어해야 하는 안티바이러스 소프트웨어 양쪽 모두에서 자주 사용되는 핵심 기술 중 하나이다.[1][2]

2010년에는 SSDT 호출 후킹 기술에 기반한 다수의 컴퓨터 보안 제품들이 익스플로잇 공격에 취약하다는 사실이 드러나기도 했다. 당시 공격자들은 프로그램 실행 시 발생하는 타이밍 문제를 이용하는 경쟁 조건 취약점을 악용하여 해당 보안 제품들의 자체 보호 및 검사 기능을 무력화시키는 데 성공했다.[2]

참조

[1] 웹사이트 Windows rootkits of 2005, part one https://community.br[...] 2005
[2] 웹사이트 Attack defeats 'most' antivirus software https://www.zdnet.co[...] 2010
[3] 웹인용 Windows rootkits of 2005, part one http://www.symantec.[...] 2005
[4] 웹인용 Attack defeats 'most' antivirus software http://www.zdnet.co.[...] 2010
[5] 웹인용 Attack defeats 'most' antivirus software http://www.zdnet.co.[...] 2010



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com