시스템 서비스 서술자 테이블
"오늘의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 구조
ctypedef 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