这是[信安成长计划]的第 20 篇文章

0x00 目录

0x01 安全描述符的结构

0x02 两个结构的不同点

0x03 真正的查询方案

0x04 参考文章

0x01 安全描述符的结构

在上一篇文章中,我们在取 DACL 的时候,对安全描述符的结构产生了疑问,在查到的资料中都在说使用 _SECURITY_DESCRIPTOR 结构,但是因为符号不是最新的等等原因,造成了错位,最后发现应该 +0x30

而在我们去分析内核实际操作的时候发现,应该使用的是 _SECURITY_DESCRIPTOR_RELATIVE 结构,采用相对偏移的方法来进行

事实证明这是正确的,也能够更加合理的解释为什么 +0x30 的位置才是真正 DACL 的位置

0x02 两个结构的不同点

通过对比可以很明显的发现,两个结构的差异主要出现在后面的四个成员中,前三个成员的偏移和大小都是一致的,只有在取后面内容的时候所需要的方式是不同的。

在 _SECURITY_DESCRIPTOR 中,取 DACL,可以直接使用 +0x20 偏移的方式来进行

在 _SECURITY_DESCRIPTOR_RELATIVE 中,取 DACL,需要先 +0x10 偏移,从中取出一个相对的偏移,在我们的测试环境中,这个值是 0x30,然后在将这个偏移值加过去,也就是 +0x30 的偏移得到 DACL

0x03 真正的查询方案

本来以为这样就结束了,但是在最后整理的时候,发现了一个我们一开始就漏掉的信息

我们选取的方案是使用 _SECURITY_DESCRIPTOR_RELATIVE 结构,从中取出偏移值以后,再将其加上

而在最后面,有一个漏掉的信息,一个非常眼熟的 +0x20 的操作

所以,我重新看了一下整个的逻辑,发现了获取 DACL 时真正的逻辑

注意下面的这个跳转,这个跳转指令的上面是对 Control 等的操作,这些值的偏移和大小在两个结构中都是一样的,所以不存在任何的冲突

而这个判断条件用来判断了 Control 中所存储的值,如果是正数就跳转,跳转以后就会直接取 +0x20 的位置,然后将其返回给 DACL

接着,我去查找了相关的资料,得到了下面这样的信息,如果未设置的话,就说明是存储的是绝对的偏移

而这个值正好是 0x8000,在判断 cx 的时候,最高位为 1,代表是一个负数,所以,如果判断 Control 为正数的话,就直接拿偏移进行了获取

所以最终的逻辑应该是这样的,根据 Control 的情况来判断使用什么样的方式

一定一定一定要把逻辑看清楚

0x04 参考文章

1.https://docs.microsoft.com/en-us/windows/win32/secauthz/security-descriptor-control

2.https://docs.microsoft.com/en-us/windows/win32/secauthz/absolute-and-self-relative-security-descriptors

Windows原理深入学习系列-访问控制列表-关于安全描述符的补充的更多相关文章

  1. Windows原理深入学习系列-访问控制列表

    这是[信安成长计划]的第 19 篇文章 0x00 目录 0x01 介绍 0x02 DACL 0x03 创建DACL 0x04 文件读取测试 0x05 进程注入测试 0x06 原理分析 Win10_x6 ...

  2. Windows原理深入学习系列-信任等级检查

    这是[信安成长计划]的第 23 篇文章 0x00 目录 0x01 介绍 0x02 逆向分析 Win10_x64_20H2 0x03 WinDBG 0x04 参考文章 在之前的时候,一直以为 SACL ...

  3. Windows原理深入学习系列-强制完整性检查

    这是[信安成长计划]的第 24 篇文章 0x00 目录 0x01 介绍 0x02 逆向分析 Win10_x64_20H2 0x03 总结 0x04 参考文章 最近因为一些事情,拖更了三个周,大家见谅啊 ...

  4. Windows原理深入学习系列-Windows内核提权

    这是[信安成长计划]的第 22 篇文章 0x00 目录 0x01 介绍 0x02 替换 Token 0x03 编辑 ACL 0x04 修改 Privileges 0x05 参考文章 继续纠正网上文章中 ...

  5. Windows原理深入学习系列-强制完整性控制

    欢迎关注微信公众号:[信安成长计划] 0x00 目录 0x01 介绍 0x02 完整性等级 0x03 文件读取测试 0x04 进程注入测试 0x05 原理分析 Win10_x64_20H2 0x06 ...

  6. Windows原理深入学习系列-特权

    这是[信安成长计划]的第 21 篇文章 0x00 目录 0x01 介绍 0x02 结构分析 0x03 进程注入测试 0x04 参考文章 0x01 介绍 在 Token 当中还存在一个特别重要的内容-- ...

  7. Android学习系列--App列表之拖拽ListView(上)

    研究了很久的拖拽ListView的实现,受益良多,特此与尔共飨.      鉴于这部分内容网上的资料少而简陋,而具体的实现过程或许对大家才有帮助,为了详尽而不失真,我们一步一步分析,分成两篇文章. 一 ...

  8. Android学习系列--App列表之拖拽ListView(下)

    接着上篇Android学习系列(10)--App列表之拖拽ListView(上)我们继续实现ListView的拖拽效果. 7.重写onTouchEvent()方法.     在这个方法中我们主要是处理 ...

  9. Git 之Windows环境下学习系列

    Git .SVN .TFS   相同点 不同点 Git     版本控制 优点: 分布式版本控制.无需联网就能版本提交 开源 缺点 入门学习难度高 SVN   优点: 集中式版本控制. 个人开源 缺点 ...

随机推荐

  1. python24day

    内容回顾 命名空间 组合 一个类的对象是另一个类对象的属性 两个类之间有 什么有什么二点关系:例:班级有学生 学生和课程.圆形和圆环.班级和课程 计算器 from functools import r ...

  2. python 小兵面向对象

    Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触过 ...

  3. 使用 TensorFlow 构建机器学习项目中文版·翻译完成

    原文:Building Machine Learning Projects with TensorFlow 协议:CC BY-NC-SA 4.0 不要担心自己的形象,只关心如何实现目标.--<原 ...

  4. redis清缓存

    先查询当前redis的服务是否已经启动 ps -ef|grep redis [root@guanbin-k8s-master ~]# ps -ef|grep redis redis 1557 1 0 ...

  5. js 计算中英文混合字符串长度

    转载请注明来源:https://www.cnblogs.com/hookjc/ function isChinese(str) {    var lst = /[u00-uFF]/;          ...

  6. Junit4进行参数化测试

    @RunWith, 当类被@RunWith注解修饰,或者类继承了一个被该注解修饰的类,JUnit将会使用这个注解所指明的运行器(runner)来运行测试,而不是JUnit默认的运行器. 要进行参数化测 ...

  7. GFS 分布式文件系统

    GFS 分布式文件系统 1.GlusterFS概述 : GlusterFS简介  a) GlusterFS是一-个开源的分布式文件系统. 由存储服务器.客户端以及NFS/Samba存储网关(可选,根据 ...

  8. 从上下文中获取所有的原生controller

    1 /** 2 * 获取项目所有被注解修饰的url 3 * @param run 4 */ 5 public void getAllUrl(ConfigurableApplicationContext ...

  9. Scala变量和数据类型

    一.注释及代码规范 Scala的注释和Java中完全相同:单行注释:// .多行注释:/* */ 以及文档注释:/**   */: 使用tab操作,实现缩进,默认整体向右边移动,用shift+tab整 ...

  10. 5个不常提及的HTML技巧

    2021年你需要知道的HTML标签和属性 Web开发人员都在广泛的使用HTML.无论你使用什么框架或者选择哪个后端语言,框架在变,但是HTML始终如一.尽管被广泛使用,但还是有一些标签或者属性是大部分 ...