调用门提权

在我写的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

在这里插入图片描述

继续运行,蓝屏了

在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

langchain模型及I/O的封装

langchain安装&#xff1a;pip install langchain-openai https://python.langchain.com/v0.2/docs/integrations/platforms/openai/ 注意&#xff1a;安装后&#xff0c;我们需要在环境变量中配置OPENAI_API_KEY&#xff0c;langchain会自动获取 1.模型的封装 指令生成式模…

阿里斑马智行 2025届秋招 NLP算法工程师

文章目录 个人情况一面/技术面 1h二面/技术面 1h三面/HR面 20min 个人情况 先说一下个人情况&#xff1a; 学校情况&#xff1a;211本中9硕&#xff0c;本硕学校都一般&#xff0c;本硕都是计算机科班&#xff0c;但研究方向并不是NLP&#xff0c;而是图表示学习论文情况&…

谈一谈QThread::CurrentThread和this->thread

QThread::CurrentThread是指的当前函数调用者者所在的线程 this->thread是指的当前对象所在的线程&#xff08;对象创建出来的时候所在的线程&#xff09; Qt文档说明 CurrentThread返回一个指向管理当前执行线程的QThread的指针 thread返回对象所在的线程 这两个函数所…

深度学习实验十一 卷积神经网络(2)——基于LeNet实现手写体数字识别实验

目录 一、数据 二、模型构建 三、模型训练及评价 四、打印参数量和计算量 五、模型预测 附&#xff1a;完整可运行代码 实验大致步骤&#xff1a; 一、数据 下载网站&#xff1a;MNIST数据集 之前的官网不能下载数据集了&#xff0c;403了&#xff0c;所以找到一个类似…

Python语法便捷查询

一、Python基础语法&#xff1a; (1)注释&#xff1a; (2)标识符&#xff1a; 简介&#xff1a;标识符的格式限制和C语言一样 (3)字符串定义方法&#xff1a; (4)字符串拼接&#xff1a; (5)字符串的格式化&#xff08;占位拼接&#xff09;&#xff1a; 和C语言的printf类…

Ansys Maxwell - 3PH 感应电机 - 第 2 部分 - 机床工具包 ACT

本篇博文是“Ansys Maxwell&#xff1a;3PH 感应电机 - 力和热耦合”的延续。在本篇博文中&#xff0c;我将展示如何使用 Ansys Machine Toolkit ACT 开发扭矩与速度曲线&#xff08;一系列性能曲线&#xff0c;包括效率图&#xff09;&#xff0c;以评估在 Ansys Maxwell 中建…

【含开题报告+文档+PPT+源码】基于springboot的教师评价系统的设计与实现

开题报告 随着信息技术的迅猛发展&#xff0c;教育信息化已成为现代教育的必然趋势。教研室作为高校教学管理的重要机构&#xff0c;肩负着提升教学质量、推动教学改革的重要使命。然而&#xff0c;传统的教学管理方式往往存在效率低下、数据分散、管理不便等问题&#xff0c;…

用 Python 从零开始创建神经网络(八):梯度、偏导数和链式法则

梯度、偏导数和链式法则 引言1. 偏导数2. 和的偏导数3. 乘法的偏导数4. Max 的偏导数5. 梯度&#xff08;The Gradient&#xff09;6. 链式法则&#xff08;The Chain Rule&#xff09; 引言 在我们继续编写我们的神经网络代码之前&#xff0c;最后两个需要解决的难题是梯度和…

并查集 poj 2524,1611,1703,2236,2492,1988 练习集【蓝桥杯备赛】

目录 前言 并查集优势 Ubiquitous Religions poj 2524 问题描述 问题分析 代码 The Suspects poj 1611 问题描述 问题分析 代码 Wireless Network poj 2236 问题描述 问题分析 代码 分类 带权并查集合 权值树构建步骤 Find them, Catch them poj 1703 问题描述 问题分…

zabbix监控tomcat

1. 准备JDK环境 #vim /etc/profile export JAVA_HOME/usr/local/jdk export TOMCAT_HOME/usr/local/tomcat export PATH$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$TOMCAT_HOMOE/bin [rootCentOS8 ~]# source /etc/profile [rootCentOS8 ~]# java -version openjdk version &q…

Nuget For Unity插件介绍

NuGet for Unity&#xff1a;提升 Unity 开发效率的利器 NuGet 是 .NET 开发生态中不可或缺的包管理工具,你可以将其理解为Unity的Assets Store或者UPM,里面有很多库可以帮助我们提高开发效率。当你想使用一个库,恰好这个库没什么依赖(比如newtonjson),那么下载包并找到Dll直接…

如何在 Ubuntu 上安装 Mattermost 团队协作工具

简介 Mattermost 是一个开源、自托管的通信平台&#xff0c;专为团队协作设计。它类似于 Slack&#xff0c;提供聊天、消息传递和集成功能。Mattermost 在重视数据隐私的组织中特别受欢迎&#xff0c;因为它允许团队在自己的服务器上管理通信。以下是 Mattermost 的一些关键特…

初识Linux—— 基本指令(上)

前言 Linux简述 ​ Linux是一种开源、自由、类UNIX的操作系统&#xff0c;由著名的芬兰程序员林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;于1991年首次发布。Linux的内核在GNU通用公共许可证&#xff08;GPL&#xff09;下发布&#xff0c;这意味着任何人都可以自由…

VBA技术资料MF223:从文件添加新模块

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

利用RAGflow和LM Studio建立食品法规问答系统

前言 食品企业在管理标准、法规&#xff0c;特别是食品原料、特殊食品法规时&#xff0c;难以通过速查法规得到准确的结果。随着AI技术的发展&#xff0c;互联网上出现很多AI知识库的解决方案。 经过一轮测试&#xff0c;找到问题抓手、打通业务底层逻辑、对齐行业颗粒度、沉…

路径规划——RRT*算法

路径规划——RRT*算法 算法原理 RRT Star 算法是一种渐近最优的路径规划算法&#xff0c;它是 RRT 算法的优化版本。RRT Star 算法通过不断地迭代和优化&#xff0c;最终可以得到一条从起点到目标点的最优路径。 在学习RRT Star 算法之前最好先学习一下RRT原始算法&#xff1…

Java——并发工具类库线程安全问题

摘要 本文探讨了Java并发工具类库中的线程安全问题&#xff0c;特别是ThreadLocal导致的用户信息错乱异常场景。文章通过一个Spring Boot Web应用程序示例&#xff0c;展示了在Tomcat线程池环境下&#xff0c;ThreadLocal如何因线程重用而导致异常&#xff0c;并讨论了其他并发…

网络编程套接字

前言&#xff1a; 认识了网络&#xff0c;我们就应该考虑一下如何编程实现不同主机上的应用进程之间如何进行双向互通的端点。 套接字&#xff08;Socket&#xff09;是网络编程的一种基本概念&#xff0c;套接字是应用程序通过网络协议进行通信的接口&#xff0c;是操作系统提…

计算机网络:运输层 —— TCP 的拥塞控制

文章目录 TCP的拥塞控制拥塞控制的基本方法流量控制与拥塞控制的区别拥塞控制分类闭环拥塞控制算法 TCP的四种拥塞控制方法&#xff08;算法&#xff09;窗口慢开始门限慢开始算法拥塞避免算法快重传算法快恢复算法 TCP拥塞控制的流程TCP拥塞控制与网际层拥塞控制的关系 TCP的拥…

vue学习第8章(vue的购物车案例)

&#x1f389;&#x1f389;&#x1f389;欢迎来到我的博客,我是一名自学了2年半前端的大一学生,熟悉的技术是JavaScript与Vue.目前正在往全栈方向前进, 如果我的博客给您带来了帮助欢迎您关注我,我将会持续不断的更新文章!!!&#x1f64f;&#x1f64f;&#x1f64f; 文章目录…