Windows原理深入学习系列-访问控制列表-关于安全描述符的补充
这是[信安成长计划]的第 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
Windows原理深入学习系列-访问控制列表-关于安全描述符的补充的更多相关文章
- Windows原理深入学习系列-访问控制列表
这是[信安成长计划]的第 19 篇文章 0x00 目录 0x01 介绍 0x02 DACL 0x03 创建DACL 0x04 文件读取测试 0x05 进程注入测试 0x06 原理分析 Win10_x6 ...
- Windows原理深入学习系列-信任等级检查
这是[信安成长计划]的第 23 篇文章 0x00 目录 0x01 介绍 0x02 逆向分析 Win10_x64_20H2 0x03 WinDBG 0x04 参考文章 在之前的时候,一直以为 SACL ...
- Windows原理深入学习系列-强制完整性检查
这是[信安成长计划]的第 24 篇文章 0x00 目录 0x01 介绍 0x02 逆向分析 Win10_x64_20H2 0x03 总结 0x04 参考文章 最近因为一些事情,拖更了三个周,大家见谅啊 ...
- Windows原理深入学习系列-Windows内核提权
这是[信安成长计划]的第 22 篇文章 0x00 目录 0x01 介绍 0x02 替换 Token 0x03 编辑 ACL 0x04 修改 Privileges 0x05 参考文章 继续纠正网上文章中 ...
- Windows原理深入学习系列-强制完整性控制
欢迎关注微信公众号:[信安成长计划] 0x00 目录 0x01 介绍 0x02 完整性等级 0x03 文件读取测试 0x04 进程注入测试 0x05 原理分析 Win10_x64_20H2 0x06 ...
- Windows原理深入学习系列-特权
这是[信安成长计划]的第 21 篇文章 0x00 目录 0x01 介绍 0x02 结构分析 0x03 进程注入测试 0x04 参考文章 0x01 介绍 在 Token 当中还存在一个特别重要的内容-- ...
- Android学习系列--App列表之拖拽ListView(上)
研究了很久的拖拽ListView的实现,受益良多,特此与尔共飨. 鉴于这部分内容网上的资料少而简陋,而具体的实现过程或许对大家才有帮助,为了详尽而不失真,我们一步一步分析,分成两篇文章. 一 ...
- Android学习系列--App列表之拖拽ListView(下)
接着上篇Android学习系列(10)--App列表之拖拽ListView(上)我们继续实现ListView的拖拽效果. 7.重写onTouchEvent()方法. 在这个方法中我们主要是处理 ...
- Git 之Windows环境下学习系列
Git .SVN .TFS 相同点 不同点 Git 版本控制 优点: 分布式版本控制.无需联网就能版本提交 开源 缺点 入门学习难度高 SVN 优点: 集中式版本控制. 个人开源 缺点 ...
随机推荐
- PyTorch 介绍 | TRANSFORMS
数据并不总是满足机器学习算法所需的格式.我们使用transform对数据进行一些操作,使得其能适用于训练. 所有的TorchVision数据集都有两个参数,用以接受包含transform逻辑的可调用项 ...
- Arduino+ESP32 之 SD卡读写
背景知识: ESP32有两种使用SD卡的方法,一种是使用SPI接口访问SD卡,另一种是使用SDMMC接口访问SD卡 . Arduino core for the ESP32中SPI方式占用4个IO口, ...
- java多线程中同步的问题?
一.通过模拟网络延迟,解决同步的问题. package com.zxf.demo; public class G01 implements Runnable{ private int num=10; ...
- HTTPS 原理详解 (转)
HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer),其实 HTTPS 并不是一个新鲜协议,Google 很早就开始启用了,初衷 ...
- Idea 如何不通过模板创建支持Maven的JavaWeb项目
手动与模板创建的区别,请自行体会. 1. 点击创建项目 2. 不勾选骨架 3.填写项目名称以及该Maven项目坐标(groupid.artifactid.version). 在仓库中,以坐标确定项目. ...
- 深入解析HashMap、HashTable (转)
集合类之番外篇:深入解析HashMap.HashTable Java集合类是个非常重要的知识点,HashMap.HashTable.ConcurrentHashMap等算是集合类中的重点,可谓&quo ...
- Java开发调试技巧及Eclipse快捷键使用方法
1. 快捷键 syso 通过打印输出来调试,println可接受object型的参数,能输出任何类型 Syso输出的是黑色字体,代表的是Debug的信息 Syse,输出的是红色字体,代表错误的输出信息 ...
- finally块
/* finally 块: finally块的 使用前提是必须要存在try块才能使用. finally块的代码在任何情况下都会执行的,除了jvm退出的情况. finally非常适合做资源释放的工作,这 ...
- Java两个整数相除保留n位小数
方式1:被除数转double后,除以除数,结果是一个double类型的数,将double结果按要求保留n位小数即可. 保留n位小数的写法 int a = 10; int b = 3; double r ...
- Solution -「CF 494C」Helping People
\(\mathcal{Description}\) Link. 给定序列 \(\{a_n\}\) 和 \(m\) 个操作,第 \(i\) 个操作有 \(p_i\) 的概率将 \([l_i,r_ ...