调用门提权

在我写的2.保护模式+段探测这篇文章中,我们提到了S位对于段描述符的控制,之前我们已经介绍了代码段和数据段,现在我们来把目光转到系统段

在这里插入图片描述

在这么多中结构里面,我们今天要介绍的就是编号为12的,32位调用门

在这里插入图片描述

结合上面的图,我们先暂时只需要记住,当S = 0 ,type = C,那么这说明这个段描述符是一个调用门

也就是下图所示

在这里插入图片描述

Segment Selector

首先我们可以看见16到31位是段选择子,它的意义就是当我们成功进入调用门之后,这里段选择子的值会被放入cs中,以达到跨段跳转的目的

Offset in Segment

通过上面的图,我们可以看见,Offset被分为两段,这也就是我们在跳转时使用的逻辑地址

以我们在4.数据段代码段的权限划分中的部分代码为示例,稍作修改

int _tmain(int argc,_TCHAR* argv[]){
	char bufcode[6] = {0,0,0,0,0x48,0};
	*(int *)&bufcode[0] = (int)test;
	__asm{
		call far bufcode;//主要改了这里
	}
}

通过查阅资料得知,bufcode里面的前四个字节,在我们之前的jmp far 跨段中是有意义的,但是在调用门使用的过程中,cpu不会处理前四个字节

这里我画出示意图来描述调用门的过程

在这里插入图片描述

关于调用门

实现提权

现在我们写一段示例代码来研究这个过程

#include "stdafx.h"
#include <Windows.h>

Void __declspec(naked) Myfunction(){
	__asm{
		int 3;
		retf;
	}
}

int _tmain(int argc,_TCHAR* argv[]){
	char bufcode[6] = {0,0,0,0,0x48,0};
	printf("%x\r\n",Myfunction);
	system("pause");
	__asm{
		call fword ptr bufcode;
	}
	return 0;
}

在研究之前我们先为了简化实验,首先关闭了编译器自带的增量链接和地址的随机化

在这里插入图片描述
在这里插入图片描述

做完这两项之后,我们就可以开始思考怎么去构造我们的调用门

在上面的代码中,我用system函数来打了一个暂停,来看看我们裸函数的地址

在这里插入图片描述

这里再贴一次上面的调用门的解构图

在这里插入图片描述

我们现在一点点向里面填充,首先是我们的相对地址0x401000,上面的一节31到16为我们只有40,补上00

这时候我们的调用门是0040xxxx xxxx1000(x为暂时没确定的值)

之后我们来看0到16的内容,若要我们调用门要有效,P需置为1,DPL位描述的是我们使用这个调用门需要的权限,因为我们再R3来调用它,所以为11,type为固定的1100,后面的567三位都是0,参数我们没有也是0,所以现在我们的调用门被填充成为了0040ec00 xxxx1000

继续向下,最后两字节我们填入0008,原因我稍后介绍,现在,我们的调用门的值被确定为了

0040ec00 00081000

为什么是0008呢,我们之前说过,调用门的段选择子会在被调用的时候填入我们CS中,对于R3,这时的CS为1B,那么对于R0呢?

如果我们使用Windbg的暂停,我们就会进R0的int 3这时候我们看下我们的寄存器

nt!RtlpBreakWithStatusInstruction:
83e6e394 cc              int     3
0: kd> r 
eax=00000001 ebx=00026160 ecx=9f99a938 edx=00000000 esi=83f2cd20 edi=83f2e654
eip=83e6e394 esp=83f29b84 ebp=83f29bb8 iopl=0         nv up ei pl nz na po nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00000202

可以看见,这时候CS的值是08,这个值有什么特殊意义呢?

它的二进制是1000,如果我们将其看作是段选择子那么它描述的就是RFL为R0和index为1的段描述符,我们打开此时的GDT,可以看见对应index位置上的值为00cf9b00`0000ffff,其DPL为00,这就对应了我们的R0的权限

0: kd> dq 80b99000
ReadVirtual: 80b99000 not properly sign extended
80b99000  00000000`00000000 00cf9b00`0000ffff//在这里哦
80b99010  00cf9300`0000ffff 00cffb00`0000ffff
80b99020  00cff300`0000ffff 80008b1e`400020ab
80b99030  834093f2`cc003748 0040f300`00000fff
80b99040  0000f200`0400ffff 0040ec00`00081000
80b99050  00000000`00081000 830089f2`a0680068
80b99060  00000000`00000000 00000000`00000000
80b99070  800092b9`900003ff 00000000`00000000

顺便一提,如果细心的人,会在上面R0的寄存器中,发现SS的值为10,对应的二进制的值是0001 0000,也就是刚好index为2的段描述符,值为00cf9300`0000ffff,同样是R0,只不过是Type权限变为了可读可写

那如果是CS的1b和SS的23,刚好也在这张表中,SS的值就是CS的值再加8,两个对应的段描述符同样也在上面的GDT表中,分别是00cffb000000ffff和00cff3000000ffff通过解析我们就可以知道DPL达到值为11,也就是R3

到这里为止,我们算是初步从段的视角来理解Win的权限划分

回到我们得出的调用门,把它填入到我们所call的段选择子的位置

0: kd> eq 80b99048 0040ec00`00081000
WriteVirtual: 80b99048 not properly sign extended
0: kd> dq 80b99000
ReadVirtual: 80b99000 not properly sign extended
80b99000  00000000`00000000 00cf9b00`0000ffff
80b99010  00cf9300`0000ffff 00cffb00`0000ffff
80b99020  00cff300`0000ffff 80008b1e`400020ab
80b99030  834093f2`dc003748 0040f300`00000fff
80b99040  0000f200`0400ffff 0040ec00`00081000
80b99050  830089f2`b0000068 830089f2`b0680068
80b99060  00000000`00000000 00000000`00000000
80b99070  800092b9`900003ff 00000000`00000000

然后继续运行我们代码,可以看见段寄存器已经改为了R0,而且也正是执行的我们在0x401000的语句

在这里插入图片描述

最后继续在windbg里面运行,可以看见我们成功的通过retf跳回了我们R3的代码

在这里插入图片描述

但是这样结束了吗,打开段寄存器,原本应该被还原为3b的fs,此时标红被记作0000

在这里插入图片描述

这是因为我们对切换的fs并没有还原(3b->30),当我们切回R0的时候,因为当前上下文为R3,所以此时还带着R0值的fs便被清零了,继续向下运行,我们会在下一个函数被调用(用到fs的环节)时,出现报错

在这里插入图片描述

解决问题的方法很简单,压入一个fs,最后在call完之后将fs弹出即可,这样我们的函数也就正常退出了

在这里插入图片描述

提权后我们可以做什么

如果我们想要访问一个R0的地址,不管是读还是写,都是无效的

下面我们举个例子,这是CreateThreadAPI在经过ntdll后,在R0里面的实现,我标出的0x8407bd51这个地址,我们正常在R3是没有办法访问的

在这里插入图片描述

例如我们需要在这里写值

在这里插入图片描述

会报0xC0000005

在这里插入图片描述

现在我们将这个R0的调用门利用起来

在这里插入图片描述

唯独要强调一下,声明的全局变量在使用前要置0,这个坑会在后面介绍页表的时候着重说明

在这里插入图片描述

其实不需要出来,我们就可以在windbg的反汇编中看见我们已经正确的读取了本来在R0中的值

在这里插入图片描述

外面的程序也可以看见这个值,正如我们所设想的一样,我们提权成功了

在这里插入图片描述

关于堆栈

之前有一个问题没说,当我们从R0还原为R3时,除了fs,其他的段寄存器都自动还原了

这里我就借用一下羽夏的博客了

在这里插入图片描述

在这里插入图片描述

然后我们来实践一下,看看长调用提权的esp下压了什么,省略掉之前重复的过程,我们直接来看

在这里插入图片描述

进入了R0之后,我们来看esp,可以看见栈里面已经压了所有我们需要的要修复的值

1: kd> r esp
esp=a8497da0
1: kd> dq a8497da0
ReadVirtual: a8497da0 not properly sign extended
a8497da0  0000001b`0040107b 00000023`0012fe4c//这里压了我们的cs,ss的值 ,eip和esp
a8497db0  00000000`00000000 00000000`00000000
a8497dc0  00000000`0000027f 00000000`00000000
a8497dd0  00000000`00000000 0000ffff`00001f80
a8497de0  00000000`00000000 00000000`00000000
a8497df0  00000000`00000000 00000000`00000000
a8497e00  00000000`00000000 00000000`00000000
a8497e10  00000000`00000000 00000000`00000000

最后一个问题,如果我们加上参数呢?

首先要改下调用门的值,告诉我们需要传参数,比如我们就传两个,参数默认的长度是4字节,这需要注意一下

0: kd> eq 80b99048 0040ec02`00081000
WriteVirtual: 80b99048 not properly sign extended
0: kd> dq 80b99000
ReadVirtual: 80b99000 not properly sign extended
80b99000  00000000`00000000 00cf9b00`0000ffff
80b99010  00cf9300`0000ffff 00cffb00`0000ffff
80b99020  00cff300`0000ffff 80008b1e`400020ab
80b99030  834093f6`cc003748 0040f300`00000fff
80b99040  0000f200`0400ffff 0040ec02`00081000//参数处声明有两个参数
80b99050  830089f6`a0000068 830089f6`a0680068
80b99060  00000000`00000000 00000000`00000000
80b99070  800092b9`900003ff 00000000`00000000

在这里插入图片描述

继续运行,蓝屏了

在这里插入图片描述

还是没有大佬的功力,排查了很久反复蓝屏,还是先到这里吧(逃

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/917959.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Web Service 学习笔记

Web Service 学习笔记 Web Service 基本概念 Web Service 即 web 服务&#xff0c;它是一种跨编程语言和跨操作系统平台的远程调用技术。 Java 中共有三种 Web Service 规范&#xff1a; JAX-WS(JAX-RPC): 基于 xml 数据JAXM&SAAJJAX-RS&#xff1a;基于 xml 或 json 数…

爬虫——JSON数据处理

第三节&#xff1a;JSON数据处理 在爬虫开发中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;是最常见的数据格式之一&#xff0c;特别是在从API或动态网页中抓取数据时。JSON格式因其结构简单、可读性强、易于与其他系统交互而广泛应用于前端与后端的数…

计算机编程中的设计模式及其在简化复杂系统设计中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 计算机编程中的设计模式及其在简化复杂系统设计中的应用 计算机编程中的设计模式及其在简化复杂系统设计中的应用 计算机编程中的…

【Tealscale + Headscale + 自建服务器】异地组网笔记

文章目录 效果为什么要用 Headscale云服务器安装 Headscale配置 config.yaml创建反向代理搭建管理 UI授权管理 UI添加互联设备参考 效果 首先是连接情况&#xff0c;双端都连接上自建的 Headscale&#xff0c; 手机使用移动流量&#xff0c;测试一下 ping 值 再试试进入游戏 可…

单片机学习笔记 2. LED灯闪烁

目录 0、实现的功能 1、Keil工程 2、代码实现 0、实现的功能 LED灯闪烁 1、Keil工程 闪烁原理&#xff1a;需要进行软件延时达到人眼能分辨出来的效果。常用的延时方法有软件延时和定时器延时。此次先进行软件延时 具体操作步骤和之前的笔记一致。此次主要利用无符号整型的范…

【Cesium】自定义材质,添加带有方向的滚动路线

【Cesium】自定义材质&#xff0c;添加带有方向的滚动路线 &#x1f356; 前言&#x1f3b6;一、实现过程✨二、代码展示&#x1f3c0;三、运行结果&#x1f3c6;四、知识点提示 &#x1f356; 前言 【Cesium】自定义材质&#xff0c;添加带有方向的滚动路线 &#x1f3b6;一、…

Vue之插槽(slot)

插槽是vue中的一个非常强大且灵活的功能&#xff0c;在写组件时&#xff0c;可以为组件的使用者预留一些可以自定义内容的占位符。通过插槽&#xff0c;可以极大提高组件的客服用和灵活性。 插槽大体可以分为三类&#xff1a;默认插槽&#xff0c;具名插槽和作用域插槽。 下面…

从零开始深度学习:全连接层、损失函数与梯度下降的详尽指南

引言 在深度学习的领域&#xff0c;全连接层、损失函数与梯度下降是三块重要的基石。如果你正在踏上深度学习的旅程&#xff0c;理解它们是迈向成功的第一步。这篇文章将从概念到代码、从基础到进阶&#xff0c;详细剖析这三个主题&#xff0c;帮助你从小白成长为能够解决实际…

Python 绘图工具详解:使用 Matplotlib、Seaborn 和 Pyecharts 绘制散点图

目录 数据可视化1.使用 matplotlib 库matplotlib 库 2 .使用 seaborn 库seaborn 库 3 .使用 pyecharts库pyecharts库 注意1. 确保安装了所有必要的库2. 检查Jupyter Notebook的版本3. 使用render()方法保存为HTML文件4. 使用IFrame在Notebook中显示HTML文件5. 检查是否有其他输…

【C++】vector 类模拟实现:探索动态数组的奥秘

&#x1f31f; 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。&#x1f31f; 如果你对string&#xff0c;vector还存在疑惑&#xff0c;欢迎阅读我之前的作品 &#xff1a; 之前文章&#x1f525;&#x1f52…

【ubuntu18.04】vm虚拟机复制粘贴键不能用-最后无奈换版本

我是ubuntu16版本的 之前费老大劲安装的vmware tools结果不能用 我又卸载掉&#xff0c;安装了open-vm-tools 首先删除VMware tools sudo vmware-uninstall-tools.pl sudo rm -rf /usr/lib/vmware-tools sudo apt-get autoremove open-vm-tools --purge再下载open-vm-tools s…

使用原生 OpenTelemetry 解锁各种可能性:优先考虑可靠性,而不是专有限制

作者&#xff1a;来自 Elastic Bahubali Shetti•Miguel Luna Elastic 现在支持使用 OTel Operator 在 Kubernetes 上部署和管理 Elastic Distributions of OpenTelemetry (EDOT)。SRE 现在可以访问开箱即用的配置和仪表板&#xff0c;这些配置和仪表板旨在通过 Elastic Observ…

【freertos】FreeRTOS信号量的介绍及使用

FreeRTOS信号量 一、概述二、PV原语三、函数接口1.创建一个计数信号量2.删除一个信号量3.信号量释放4.在中断释放信号量5.获取一个信号量&#xff0c;可以是二值信号量、计数信号量、互斥量。6.在中断获取一个信号量&#xff0c;可以是二值信号量、计数信号量7.创建一个二值信号…

【生物服务器】数据分析//论文润色/组学技术服务 、表观组分析、互作组分析、遗传转化实验、生物医学

DNA亲和纯化测序&#xff08;DAP-seq&#xff09;和组蛋白甲基化修饰是表观遗传学研究中两个重要的技术手段&#xff0c;它们在揭示基因表达调控机制和染色质结构动态变化中发挥着关键作用。然而&#xff0c;在实践过程中&#xff0c;这两种技术也存在一些痛点和挑战。 DNA亲和…

丹摩征文活动| 摩智云端深度解析:Faster R-CNN模型的训练与测试实战指南

目录 丹摩简介 文章前言Faster R-CNN的简介Faster RCNN的训练与测试提前准备1.1 mobaxterm&#xff08;远程连接服务器&#xff09;1.2 本文的源码下载 目标检测模型 Faster-Rcnn2.1云服务器平台 数据上传内置JupyterLab的使用本地连接使用DAMODEL实例获取实例的SSH访问信息通过…

二叉搜索树介绍

⼆叉搜索树 二叉搜索树的概念二叉搜索树的性能分析查找性能插入性能删除性能 二叉搜索树的插入二叉搜索树的查找二叉搜索树的删除⼆叉搜索树的实现代码测试代码 二叉搜索树key和key/value使⽤场景key搜索场景key/value搜索场景key/value⼆叉搜索树代码实现测试代码 二叉搜索树的…

7.揭秘C语言输入输出内幕:printf与scanf的深度剖析

揭秘C语言输入输出内幕&#xff1a;printf与scanf的深度剖析 C语言往期系列文章目录 往期回顾&#xff1a; VS 2022 社区版C语言的安装教程&#xff0c;不要再卡在下载0B/s啦C语言入门&#xff1a;解锁基础概念&#xff0c;动手实现首个C程序C语言概念之旅&#xff1a;解锁关…

5.4.2-1 编写Java程序在HDFS上创建文件

本次实战涉及使用Java操作Hadoop HDFS&#xff0c;包括创建文件、判断文件存在性及异常处理。通过手动添加依赖、启动HDFS服务&#xff0c;成功在HDFS上创建和检查文件。进一步探索了文件操作的最佳实践&#xff0c;如检查文件存在性以避免重复创建&#xff0c;以及处理HDFS安全…

RabbitMQ教程:路由(Routing)(四)

文章目录 RabbitMQ教程&#xff1a;路由&#xff08;Routing&#xff09;&#xff08;四&#xff09;一、引言二、基本概念2.1 路由与绑定2.2 Direct交换机2.3 多绑定2.4 发送日志2.5 订阅 三、整合代码3.1 EmitLogDirectApp.cs3.2 ReceiveLogsDirectApp.cs3.3 推送所有和接收e…

智云-一个抓取web流量的轻量级蜜罐v1.5

智云-一个抓取web流量的轻量级蜜罐v1.5 github地址 https://github.com/xiaoxiaoranxxx/POT-ZHIYUN 新增功能-自定义漏洞信息 可通过正则来添加相关路由以及响应来伪造 nacos的版本响应如下 日流量态势 月流量态势 抓取流量效果