admin 管理员组文章数量: 887016
对象结构
对象是对操作系统中需要保护和集中管理的资源的一种抽象,对象拥有统一的固定头部,保存着抽象出来的信息。此外还有可选头部和对象体。
nt!_OBJECT_HEADER
+0x000 PointerCount : Int8B
+0x008 HandleCount : Int8B
+0x008 NextToFree : Ptr64 Void
+0x010 Lock : _EX_PUSH_LOCK
+0x018 TypeIndex : UChar
+0x019 TraceFlags : UChar
+0x019 DbgRefTrace : Pos 0, 1 Bit
+0x019 DbgTracePermanent : Pos 1, 1 Bit
+0x01a InfoMask : UChar
+0x01b Flags : UChar
+0x01b NewObject : Pos 0, 1 Bit
+0x01b KernelObject : Pos 1, 1 Bit
+0x01b KernelOnlyAccess : Pos 2, 1 Bit
+0x01b ExclusiveObject : Pos 3, 1 Bit
+0x01b PermanentObject : Pos 4, 1 Bit
+0x01b DefaultSecurityQuota : Pos 5, 1 Bit
+0x01b SingleHandleEntry : Pos 6, 1 Bit
+0x01b DeletedInline : Pos 7, 1 Bit
+0x01c Spare : Uint4B
+0x020 ObjectCreateInfo : Ptr64 _OBJECT_CREATE_INFORMATION
+0x020 QuotaBlockCharged : Ptr64 Void
+0x028 SecurityDescriptor : Ptr64 Void
+0x030 Body : _QUAD
对象的头部包含着指向安全描述符的指针。
安全描述符
安全描述符保存着作为访问权限检查客体的对象的主要信息。它包含着4个关键成员,根据这4个成员可以嵌入在结构体的尾部,也可以引用自外部缓存位置。根据这个差异可以分为两种不同的结构形式:
kd> dt _SECURITY_DESCRIPTOR
ntdll!_SECURITY_DESCRIPTOR
+0x000 Revision : UChar
+0x001 Sbz1 : UChar
+0x002 Control : Uint2B
+0x008 Owner : Ptr64 Void
+0x010 Group : Ptr64 Void
+0x018 Sacl : Ptr64 _ACL
+0x020 Dacl : Ptr64 _ACL
kd> dt _SECURITY_DESCRIPTOR_RELATIVE
nt!_SECURITY_DESCRIPTOR_RELATIVE
+0x000 Revision : UChar
+0x001 Sbz1 : UChar
+0x002 Control : Uint2B
+0x004 Owner : Uint4B
+0x008 Group : Uint4B
+0x00c Sacl : Uint4B
+0x010 Dacl : Uint4B
Owner和Group代表了该安全描述符的属主Sid,Sacl是系统访问控制表(System Access Control List)的简称,里面可以包含当前对象的审计(Audit)、完整性级别(Integrity Level)以及可信赖级别(Trust Level)等信息,与前面提到的Dacl共用同一结构体。
对象目录
只有部分对象拥有名称信息,它们被称为命名对象。命名对象的主要作用是方便对象在不同的进程中共享,它们被按类别编纂成对象目录,因此可以通过在对象目录中的路径信息找到该对象。对象目录的实现如下图所示:
对象类型
对象类型是对象中非常重要的信息,Windows将对象的类型信息从同一类对象中抽象出来,保存成一个单独的类型对象。系统中全部的类型对象被集中放置在一个表中,对象通过维护一个指向该表的索引(TypeIndex)来表明当前对象的类型。这个索引值直接保存在对象的头部,而对象体与对象头部直接相邻,如果对象体被损坏,有可能导致头部的索引值被改变,使所谓的类型混淆(Type Confusion)利用成为可能。为了缓解这一问题,Windows 10对该索引值做了特殊保护,如下图所示:
这种保护方式简单而强大,新的索引值由3部分经过异或操作得到:类型对象在类型对象表中的真实索引值,对象头部地址的第二个字节(即第8到第15位),保存在ObHeaderCookie全局变量中的因每次系统启动而异的Cookie字节。其中,ObHeaderCookie的引入,使同一类型的对象在不同机器上,甚至是同一机器上两次启动之间的索引值不同,然而这样并不足以缓解类型混淆利用,我们还可以利用信息泄露(Info Leak)来绕过(Bypass)该保护,因此还引入了对象头部地址,使得在同一时刻、同一系统中的两个相同类型对象的不同实例间的索引值也不相同,从而有效地缓解类型混淆利用。
欢迎关注我的微博:大雄_RE。专注软件逆向,分享最新的好文章、好工具,追踪行业大佬的研究成果。
版权声明:本文标题:Windows操作系统----安全机制----对象 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1726655277h1006710.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论