这是[信安成长计划]的第 24 篇文章
0x00 目录
0x01 介绍
0x02 逆向分析 Win10_x64_20H2
0x03 总结
0x04 参考文章
最近由于一些原因,拖更了三个星期,希望大家能够理解。接下来我将继续推出其他系列的内容,期待大家的支持。
我们继续之前的进度,深入学习 Windows 原理。
在之前的文章中,我们介绍了强制完整性控制的机制,这次我们将探讨在实际的权限检查中是如何进行的。
0x01 介绍
这次我们继续从上次的 ObpGrantAccess 函数开始分析,根据函数名可以很容易判断出它的作用。
如果不清楚为什么从 ObpGrantAccess 开始分析的,可以参考上一篇文章的介绍部分。
0x02 逆向分析 Win10_x64_20H2
进入函数后,会进行一系列保存堆栈、赋值等操作。
接下来会有一些权限的判断,这些目前不是我们关注的重点。
然后判断 SACL 中是否有有效内容,这是获取前的最后判断。
接下来是我们非常熟悉的内容,是否是相对地址,忘记这部分内容的可以参考之前关于访问控制列表的文章。
获取到与完整性等级相关的 ACE。
然后从 ACE 中获取所需的内容。
接下来是我们非常熟悉的函数 SepCopyTokenIntegrity,这个在刚开始分析强制完整性控制时已经分析过。
它的主要操作是根据 Token 中的 IntegrityLevelIndex,从 UserAndGroups 中获取当前的完整性等级。
然后进行最关键的比较,对两个 Sid 进行比较。
根据分析可以知道 r12 是通过 SepCopyTokenIntegrity 从当前的 Token 中取出的完整性等级信息。
另一个 rbp 是从 SACL 中取出的完整性等级。
r12 的来源是当前上下文的 Token 信息。
而 SACL 的来源不在当前,一直往前追溯,可以看到它是从 SeAccessCheck 的 rcx 中来的,根据描述可以理解这是被访问对象的信息。
这样也就基本完成了对完整性信息的检测,对于 RtlEqualSid 函数,之前也进行过分析,这里就不再提及了。
0x03 总结
之前我一直有一个疑问,我最初是通过 SepCopyTokenIntegrity 来获取进程的完整性等级的,但为什么很多资料都说完整性等级是存储在 SACL 中的。
从这里可以得知,两个取出的都是完整性等级信息,但它们所代表的情况不同。
在进行权限验证时,会通过 SepCopyTokenIntegrity 取出当前的完整性等级,然后从目标对象的 SACL 中获取目标的完整性等级,然后进行相应的判断和验证。
0x04 参考文章
1.https://www.php.cn/link/4b614442441630d9df7528a7a7af9315
2.https://www.php.cn/link/6b542509805b2618d880d79d813a51e9
3.https://www.php.cn/link/10cc05b82e144366c50629b9e87c56ed
4.https://www.php.cn/link/5d2c27ae7617d2660bbdc0f22d141ab8
5.https://www.php.cn/link/3db0c81b0a25ab06af83bde59115dd4b
以上就是Windows原理深入学习系列-强制完整性检查的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号