调用门提权

在我写的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.rhkb.cn/news/473434.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文心一言编写小球反弹程序并优化

使用文心一言尝试编写一个小游戏&#xff0c;先完成 1.python中用pygame模块设计出一个显示区域720x540的屏幕&#xff0c;并绘制一个小球&#xff0c;可以完成小球在显示区域内自动随机直线移动&#xff0c;碰到显示区域的便捷并反弹 import pygame import random import sy…

华为开源自研AI框架昇思MindSpore应用案例:人体关键点检测模型Lite-HRNet

如果你对MindSpore感兴趣&#xff0c;可以关注昇思MindSpore社区 一、环境准备 1.进入ModelArts官网 云平台帮助用户快速创建和部署模型&#xff0c;管理全周期AI工作流&#xff0c;选择下面的云平台以开始使用昇思MindSpore&#xff0c;获取安装命令&#xff0c;安装MindSpo…

gitlab和jenkins连接

一&#xff1a;jenkins 配置 安装gitlab插件 生成密钥 id_rsa 要上传到jenkins&#xff0c;id_rsa.pub要上传到gitlab cat /root/.ssh/id_rsa 复制查看的内容 可以看到已经成功创建出来了对于gitlab的认证凭据 二&#xff1a;配置gitlab cat /root/.ssh/id_rsa.pub 复制查…

SpringBoot实现WebSocket

参考链接&#xff1a;https://www.kancloud.cn/king_om/mic_03/2783864 一、环境搭建 1.创建SpringBoot项目&#xff0c;引入相关依赖 <dependencies><!-- Spring Boot核心启动器&#xff0c;引入常用依赖基础 --><dependency><groupId>org.springf…

现代密码学|公钥密码体制 | RSA加密算法及其数学基础

文章目录 公钥密码RSA数学基础欧拉函数欧拉定理模指数运算 RSA加密算法对rsa的攻击 公钥密码 现代密码学&#xff5c;公钥密码体制概述 加密 A用B的公钥加密 B用B的私钥解密 认证 A使用A的私钥加密 B使用A的公钥解密 加密认证 A用A的私钥加密&#xff0c;再用B的公钥加密 B用…

VuePress v2 快速搭建属于自己的个人博客网站

目录 为什么用VuePress&#xff1f; 一、前期准备 Node.js 使用主题快速开发 二、VuePress安装 三、个性化定制 修改配置信息 删除不需要的信息 博客上传 四、部署 使用github快速部署 初始化仓库 本地配置 配置github的ssh密钥 部署 为什么用VuePress&#xff…

【阅读记录-章节1】Build a Large Language Model (From Scratch)

目录 1. Understanding large language models1.1 What is an LLM?补充介绍人工智能、机器学习和深度学习的关系机器学习 vs 深度学习传统机器学习 vs 深度学习&#xff08;以垃圾邮件分类为例&#xff09; 1.2 Applications of LLMs1.3 Stages of building and using LLMs1.4…

平台整合是网络安全成功的关键

如今&#xff0c;组织面临着日益复杂、动态的网络威胁环境&#xff0c;随着恶意行为者采用越来越阴险的技术来破坏环境&#xff0c;攻击的数量和有效性也在不断上升。我们最近的 Cyber​​Ark 身份威胁形势报告&#xff08;2024 年 5 月&#xff09;发现&#xff0c;去年 99% 的…

PlantUML——时序图

PlantUML时序图 背景 时序图&#xff08;Sequence Diagram&#xff09;&#xff0c;又名序列图、循序图&#xff0c;是一种UML交互图&#xff0c;用于描述对象之间发送消息的时间顺序&#xff0c;显示多个对象之间的动态协作。时序图的使用场景非常广泛&#xff0c;几乎各行各…

【MYSQL】分库分表

一、什么是分库分表 分库分表就是指在一个数据库在存储数据过大&#xff0c;或者一个表存储数据过多的情况下&#xff0c;为了提高数据存储的可持续性&#xff0c;查询数据的性能而进行的将单一库或者表分成多个库&#xff0c;表使用。 二、为什么要分库分表 分库分表其实是两…

Spring纯注解开发

在我的另一篇文章中&#xff08;初识Spring-CSDN博客&#xff09;&#xff0c;讲述了Bean&#xff0c;以及通过xml方式定义Bean。接下来将讲解通过注解的方法管理Bean。 我们在创建具体的类的时候&#xff0c;可以直接在类的上面标明“注解”&#xff0c;以此来声明类。 1. 常…

git push时报错! [rejected] master -> master (fetch first)error: ...

错误描述&#xff1a;在我向远程仓库push代码时&#xff0c;即执行 git push origin master命令时发生的错误。直接上错误截图。 错误截图 错误原因&#xff1a; 在网上查了许多资料&#xff0c;是因为Git仓库中已经有一部分代码&#xff0c;它不允许你直接把你的代码覆盖上去…

java常用工具包介绍

Java 作为一种广泛使用的编程语言&#xff0c;提供了丰富的标准库和工具包来帮助开发者高效地进行开发。这些工具包涵盖了从基础的数据类型操作到高级的网络编程、数据库连接等各个方面。下面是一些 Java 中常用的工具包&#xff08;Package&#xff09;及其简要介绍&#xff1…

latex中,两个相邻的表格,怎样留一定的空白

目录 问题描述 问题解决 问题描述 在使用latex写论文时&#xff0c;经常表格需要置顶写&#xff0c;则会出现两个表格连在一起的情况。下一个表名容易与上面的横线相连&#xff0c;如何通过明令&#xff0c;留出一定的空白。 问题解决 在第二个表格的 \centering命令之后…

react中如何在一张图片上加一个灰色蒙层,并添加事件?

最终效果&#xff1a; 实现原理&#xff1a; 移动到图片上的时候&#xff0c;给img加一个伪类 &#xff01;&#xff01;此时就要地方要注意了&#xff0c;因为img标签是闭合的标签&#xff0c;无法直接添加 伪类&#xff08;::after&#xff09;&#xff0c;所以 我是在img外…

C++builder中的人工智能(27):如何将 GPT-3 API 集成到 C++ 中

人工智能软件和硬件技术正在迅速发展。我们每天都能看到新的进步。其中一个巨大的飞跃是我们拥有更多基于自然语言处理&#xff08;NLP&#xff09;和深度学习&#xff08;DL&#xff09;机制的逻辑性更强的AI聊天应用。有许多AI工具可以用来开发由C、C、Delphi、Python等编程语…

【项目开发】URL中井号(#)的技术细节

未经许可,不得转载。 文章目录 前言一、# 的基本含义二、# 不参与 HTTP 请求三、# 后的字符处理机制四、# 的变化不会触发网页重新加载五、# 的变化会记录在浏览器历史中六、通过 window.location.hash 操作七、onhashchange 事件八、Google 对 # 的处理机制前言 2023 年 9 月…

AUTOSAR_EXP_ARAComAPI的7章笔记(5)

☞返回总目录 相关总结&#xff1a;典型的 SOME/IP 多绑定用例总结 7.3.3 典型的SOME/IP多绑定用例 在前面的章节中&#xff0c;我们简要提到&#xff0c;在一个典型的SOME/IP 网络协议的部署场景中&#xff0c;AP SWC不太可能自己打开套接字连接来与远程服务通信。为什么不…

Jenkins下载安装、构建部署到linux远程启动运行

Jenkins详细教程 Winodws下载安装Jenkins一、Jenkins配置Plugins插件管理1、汉化插件2、Maven插件3、重启Jenkins&#xff1a;Restart Safely插件4、文件传输&#xff1a;Publish Over SSH5、gitee插件6、清理插件&#xff1a;workspace cleanup system系统配置1、Gitee配置2、…

Flutter:Dio下载文件到本地

import dart:io; import package:dio/dio.dart;main(){// 创建dio对象final dio Dio();// 下载地址var url https://*******.org/files/1.0.0.apk;// 手机端路径String savePath Directory.systemTemp.path/ceshi.apk;print(savePath);downLoad(dio,url,savePath); }downLo…