Windows内核实验001 中断提权
文章目录
- 实验环境
- 内核提权
- IDT的基本知识
- 什么是中断
- 什么是IDT表
- 在PC Hunter中查看IDT表
- 中断提权的基本原理
- 写一个三环的小程序
- 修改IDT表
- 提权测试
本篇文章基于周壑老师的讲解,感谢周壑老师。
实验环境
- windbg双机调试环境
- VS开发环境
- 32位 WIN7 虚拟机
内核提权
内核态的程序拥有一切权限,在Windows操作系统上,没有任何其他软件可以限制内核态的程序。如果让一个用户层的小程序,提升至内核权限,那么就可以操作系统上的一切资源,做任何想做的事。今天我们借助一个内核实验来完成用户层到内核层的提权。
IDT的基本知识
什么是中断
当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况。此时,CPU暂时终止程序的运行转而去处理这个情况的过程就叫中断
什么是IDT表
常见的中断有 除零(0号中断)、断点(3号中断)、系统调用(2e号中断), 每一种中断对应一个中断号。每一个中断号都有对应的中断处理函数。
这样操作系统就会用数据结构来维护这些中断处理函数,这个数据结构就是IDT 表。
IDT表全称:Interrupt Descriptor Table,中断描述符表。
当CPU产生中断时,就会去查IDT表,然后执行IDT表中对应的中断处理函数
在PC Hunter中查看IDT表
打开PC Hunter,点击内核钩子->系统中断表
我们可以看到当前系统的IDT表,其中序号代表的是中断号 函数名称指的是产生该序号中断时会执行的函数,后面则是对应的函数地址。
例如当CPU遇到除零异常时,就会抛出0号中断,此时查IDT表,找到对应的处理函数Divide error,然后跳转到函数地址处理除零异常。
中断提权的基本原理
IDT表是系统用于处理中断的,自然就有最高的内核权限。中断提权的基本原理实际上就是将我们自己的函数地址,去替换掉IDT表中的函数地址。进而抛出一个中断,让系统跳转到我们自己的函数。
那么替换掉哪个函数呢?还是回到PC Hunter,IDT表的位置往下拉
从序号0x20开始有一部分未被使用的IDT表,我们就将自己的函数地址替换到0x20的位置即可
写一个三环的小程序
基本代码如下
#include "pch.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>void __declspec(naked) IdtEntry()
{__asm{iretd;}
}int main()
{//0x401040为IdtEntry的函数地址if ((DWORD)IdtEntry!=0x401040){printf("wrong addr:%p", IdtEntry);exit(-1);}printf("%p", IdtEntry);system("pause");
}
我们自己写一个裸函数,然后将地址打印出来。为了方便后面的调试
需要将属性设置为release,并且去除随机基址,改用固定基址。
修改IDT表
在配置好双机调试环境以后,用windbg查看IDT表的基址,IDT表的基址保存在idtr寄存器中
接着用dq命令查看IDT表,每8位对应一个IDT表的处理函数
对比PC Hunter中的函数地址可以发现,IDT表中的函数地址实际上是由IDT地址表中的前四位和后四位拼接而成。
接着我们找到第一个值为00000000的位置,也就是序号为0x20的位置写入我们自己的函数
kd> eq 80b95500 00408e00`00081040
接着将8e修改为ee(8e对应的是DPL描述符特权级 修改以后就能让用户层的程序访问了)
kd> eq 80b95500 0040ee00`00081040
提权测试
现在我们还需要让程序产生一个中断序号为0x20的中断,从而跳转到我们的函数中。那么这个怎么实现呢。只需要加上这样一条代码
void go()
{__asm int 0x20;
}
任何一个中断都能用int [index]的方式进入。
为了观察是否提权成功,我们在函数中读取一个内核的地址,我选择的是IDT表的基址
mov eax,dword ptr ds: [0x80b95400];
mov g_tmp, eax;
最后在主函数中将这个地址打印出来。最后编译exe,在虚拟机中运行
可以看到程序已经打印出了IDT表的基址后半部分0x8CFC0
此时刷新一下PC Hunter,在0x20的位置 函数地址也显示为我们自己设置的0x401040。
到此,本次实验结束。最后附上完整代码
#include "pch.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>DWORD g_tmp;void __declspec(naked) IdtEntry()
{__asm{mov eax,dword ptr ds: [0x80b95400];mov g_tmp, eax;iretd;}
}void go()
{__asm int 0x20;
}int main()
{if ((DWORD)IdtEntry != 0x401040){printf("wrong addr:%p", IdtEntry);exit(-1);}go();printf("%p", g_tmp);system("pause");
}
Windows内核实验001 中断提权相关推荐
- Windows内核实验002 中断现场
文章目录 如何获取中断现场环境 中段现场环境 观察中断现场堆栈环境 观察中断现场的寄存器环境 段选择子 段寄存器结构 变化的段寄存器的具体含义 遗留问题:SS段寄存器和栈顶指针来自于哪? 什么是TSS ...
- Linux内核PWN-基础ROP提权
0x00 基础知识 1. linux kernel pwn 图片如果无效大伙可以转战 Linux内核pwn-基础ROP提权 https://www.52pojie.cn/thread-1713663- ...
- Windows和linux提权方法,Windows与Linux本地用户提权体验(一)
无论是Windows系统还是linux系统都是基于权限控制的,其严格的用户等级和权限是系统安全的有力保证.这么严密的用户权限是否不可逾越呢?下面笔者反其道而行之进行Windows及Linux下的提权测 ...
- Windows Wce认证过程MS11-080提权使用
Windows Wce认证过程&&MS11-080提权使用 文章目录 Windows Wce认证过程&&MS11-080提权使用 一.Windows Wce认证过程 1 ...
- Windows内核实验003 再次回到中断
文章目录 两个实验 死循环 开启中断后的死循环 KiFastCallEntry 调用零环API的两个条件 分析KiFastCallEntry 什么是KPCR 完善代码 完整代码 之前的实验我们已经实现 ...
- Windows内核实验004 API调用
文章目录 完善代码 内核API调用 修复一个潜在问题 复现问题 完整代码 前面几次实验我们已经完成了一个三环的程序调用零环API的必要条件. 提升到零环权限 使fs指向KPCR 完善代码 这次我们去掉 ...
- windows c++ 服务 当前用户提权_windows xp 提权
本地提权 要求:以实现本地低权限账号登录,至少获得一个命令行的shell. 当前几乎所有的系统都是多用户账号,这些账号可以是系统自带的账号,也可以是系统为某些应用程序设置的账号,让该应用程序就以该账号 ...
- Windows常见的几种提权方法
零基础学黑客,搜索公众号:白帽子左一 作者:掌控安全-杰斯 提权,提高自己在服务器中的权限,主要针对网站渗透过程中,当渗透某一网站时,通过各种漏洞提升WEBSHELL权限以夺得该服务器权限,通常提权是 ...
- 112.网络安全渗透测试—[权限提升篇10]—[Windows 2003 LPK.DDL劫持提权msf本地提权]
我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!! 文章目录 一.LPK.DDL劫持提权 1.sethc.exe是什么: 2.lpk.dll出现的背景: 3.Windows查 ...
最新文章
- 用ggplot包画一个简单饼图
- linux命令history
- 043_对象构造器和原型
- 重磅!神策客户服务中心升级,5 年,价值释放加速度
- Ibatis查询条件对于特殊字符的处理方法
- 人工智能和Adobe Sensei
- Windows服务二:测试新建的服务、调试Windows服务
- Mr.J-- jQuery学习笔记(二十五)--监听DOM加载
- webpack-dev-server
- 如何在Mac上自定义控制中心
- leetcode - Best Time to Buy and Sell Stock Ⅱ
- IOS学习笔记之 Socket 编程
- java 汉字转拼音_java实现汉字转拼音
- 酒店后台管理系统、客栈管理、入住会员、房间管理、房源、房型、订单、报表、酒店企业、短信模板、积分、打印、交接班、住宿、入住、锁房、收支流水、房间销售、消费项目、酒店管理、渠道销售、支付管理、连锁酒店
- STM32WB55开发板(一)单板设计-硬件介绍
- 什么是源路由(source routing)?
- SuperMap iMobel for Android 基础环境搭建
- 适合打游戏的计算机,最适合玩游戏的笔记本电脑 广受好评的三款笔记本
- 酷博社区卫生系统激活健康档案的生命活力
- mybatis-源码
热门文章
- 成功解决pypmml.base.PmmlError: (‘MalformedInputException‘, ‘Input length = 1‘)
- DL之CNN:利用CNN(keras, CTC loss, {image_ocr})算法实现OCR光学字符识别
- 成功解决pandas\core\frame.py:2754: SettingWithCopyWarning: A value is trying to be set on a copy of a s
- mysql(mariadb)常用命令(持续更新ing)
- 蓝桥杯算法训练_2的次幂表示+前缀表达式+Anagrams问题+出现次数最多的整数
- Azure Automation (5) 调整Azure SQL Database DTU
- Linux 磁盘与文件系统管理
- USACO Broken Necklace 题解(环展开成链,枚举)
- Python MySQLdb模块连接操作mysql数据库实例_python
- Effective java -- 2 对于所有对象都通用到方法