文章目录

  • 实验环境
  • 内核提权
  • IDT的基本知识
    • 什么是中断
    • 什么是IDT表
    • 在PC Hunter中查看IDT表
  • 中断提权的基本原理
  • 写一个三环的小程序
  • 修改IDT表
  • 提权测试

本篇文章基于周壑老师的讲解,感谢周壑老师。

实验环境

  1. windbg双机调试环境
  2. VS开发环境
  3. 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 中断提权相关推荐

  1. Windows内核实验002 中断现场

    文章目录 如何获取中断现场环境 中段现场环境 观察中断现场堆栈环境 观察中断现场的寄存器环境 段选择子 段寄存器结构 变化的段寄存器的具体含义 遗留问题:SS段寄存器和栈顶指针来自于哪? 什么是TSS ...

  2. Linux内核PWN-基础ROP提权

    0x00 基础知识 1. linux kernel pwn 图片如果无效大伙可以转战 Linux内核pwn-基础ROP提权 https://www.52pojie.cn/thread-1713663- ...

  3. Windows和linux提权方法,Windows与Linux本地用户提权体验(一)

    无论是Windows系统还是linux系统都是基于权限控制的,其严格的用户等级和权限是系统安全的有力保证.这么严密的用户权限是否不可逾越呢?下面笔者反其道而行之进行Windows及Linux下的提权测 ...

  4. Windows Wce认证过程MS11-080提权使用

    Windows Wce认证过程&&MS11-080提权使用 文章目录 Windows Wce认证过程&&MS11-080提权使用 一.Windows Wce认证过程 1 ...

  5. Windows内核实验003 再次回到中断

    文章目录 两个实验 死循环 开启中断后的死循环 KiFastCallEntry 调用零环API的两个条件 分析KiFastCallEntry 什么是KPCR 完善代码 完整代码 之前的实验我们已经实现 ...

  6. Windows内核实验004 API调用

    文章目录 完善代码 内核API调用 修复一个潜在问题 复现问题 完整代码 前面几次实验我们已经完成了一个三环的程序调用零环API的必要条件. 提升到零环权限 使fs指向KPCR 完善代码 这次我们去掉 ...

  7. windows c++ 服务 当前用户提权_windows xp 提权

    本地提权 要求:以实现本地低权限账号登录,至少获得一个命令行的shell. 当前几乎所有的系统都是多用户账号,这些账号可以是系统自带的账号,也可以是系统为某些应用程序设置的账号,让该应用程序就以该账号 ...

  8. Windows常见的几种提权方法

    零基础学黑客,搜索公众号:白帽子左一 作者:掌控安全-杰斯 提权,提高自己在服务器中的权限,主要针对网站渗透过程中,当渗透某一网站时,通过各种漏洞提升WEBSHELL权限以夺得该服务器权限,通常提权是 ...

  9. 112.网络安全渗透测试—[权限提升篇10]—[Windows 2003 LPK.DDL劫持提权msf本地提权]

    我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!! 文章目录 一.LPK.DDL劫持提权 1.sethc.exe是什么: 2.lpk.dll出现的背景: 3.Windows查 ...

最新文章

  1. 用ggplot包画一个简单饼图
  2. linux命令history
  3. 043_对象构造器和原型
  4. 重磅!神策客户服务中心升级,5 年,价值释放加速度
  5. Ibatis查询条件对于特殊字符的处理方法
  6. 人工智能和Adobe Sensei
  7. Windows服务二:测试新建的服务、调试Windows服务
  8. Mr.J-- jQuery学习笔记(二十五)--监听DOM加载
  9. webpack-dev-server
  10. 如何在Mac上自定义控制中心
  11. leetcode - Best Time to Buy and Sell Stock Ⅱ
  12. IOS学习笔记之 Socket 编程
  13. java 汉字转拼音_java实现汉字转拼音
  14. 酒店后台管理系统、客栈管理、入住会员、房间管理、房源、房型、订单、报表、酒店企业、短信模板、积分、打印、交接班、住宿、入住、锁房、收支流水、房间销售、消费项目、酒店管理、渠道销售、支付管理、连锁酒店
  15. STM32WB55开发板(一)单板设计-硬件介绍
  16. 什么是源路由(source routing)?
  17. SuperMap iMobel for Android 基础环境搭建
  18. 适合打游戏的计算机,最适合玩游戏的笔记本电脑 广受好评的三款笔记本
  19. 酷博社区卫生系统激活健康档案的生命活力
  20. mybatis-源码

热门文章

  1. 成功解决pypmml.base.PmmlError: (‘MalformedInputException‘, ‘Input length = 1‘)
  2. DL之CNN:利用CNN(keras, CTC loss, {image_ocr})算法实现OCR光学字符识别
  3. 成功解决pandas\core\frame.py:2754: SettingWithCopyWarning: A value is trying to be set on a copy of a s
  4. mysql(mariadb)常用命令(持续更新ing)
  5. 蓝桥杯算法训练_2的次幂表示+前缀表达式+Anagrams问题+出现次数最多的整数
  6. Azure Automation (5) 调整Azure SQL Database DTU
  7. Linux 磁盘与文件系统管理
  8. USACO Broken Necklace 题解(环展开成链,枚举)
  9. Python MySQLdb模块连接操作mysql数据库实例_python
  10. Effective java -- 2 对于所有对象都通用到方法