Windows内核实验003 再次回到中断
文章目录
- 两个实验
- 死循环
- 开启中断后的死循环
- KiFastCallEntry
- 调用零环API的两个条件
- 分析KiFastCallEntry
- 什么是KPCR
- 完善代码
- 完整代码
之前的实验我们已经实现了从三环到零环的提权,但是提权不代表能正常调用内核函数。接下来我们要实现的一个事情就是在我们的代码里正常调用内核的函数。
还是接着用上次的代码,这一次我们先来做两个实验。
两个实验
死循环
首先用windbg连上虚拟机
在我们的内核提权函数IdtEntry中写上一个死循环,接着用下面这条命令将当前函数地址写入到IDT表中
eq 80b95500 0040ee00`00081040
然后运行程序
会发现整个虚拟机直接卡死,连windbg也无法接管控制权。这是因为单核的CPU禁止中断时,系统无法中断内核代码的任何操作,导致函数中的死循环一直在运行,进而导致虚拟机卡死现象。
开启中断后的死循环
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PGPIOwjt-1573888072291)(assets/1573879516464.png)]
接着我们在代码中加入一条sti指令来开启中断,再次运行程序
我们发现此时虚拟机直接蓝屏。原因在于开启中断以后产生了时钟的硬件中断,受线程切换的影响产生蓝屏。
KiFastCallEntry
在XP系统中,系统服务在内核的入口是KiFastCallEntry。我们来大概分析一下这个函数和我们缩写的内核代码有什么区别。
首先在XP虚拟机中打开PC Hunter
接着打开驱动模块,找到第一个ntkrnlpa.exe,右键定位到驱动模块,找到exe文件,并用IDA分析,记得IDA分析的时候下载符号文件。
在IDA中搜索KiFastCallEntry这个函数
接着我们观察到这个函数中间也有一条sti指令,也做了一个开中断的操作。开启中断以后后面的代码也会受到线程调度的影响。
那么问题来了,为什么KiFastCallEntry开启中断以后没有蓝屏,我们自己写的代码反而蓝屏了呢?
这就说明这个函数在一开始到开启中断之间建立了一个安全的线程调度环境,那如果在我们的代码里建立一个安全的线程调度环境,那么我们开中断也是安全的。开启中断以后我们就可以在我们的代码里通过系统调用号来调用零环的API函数了。
调用零环API的两个条件
- 有内核权限
- 有安全的线程调度环境
分析KiFastCallEntry
第一个条件我们已经完成了,接下来我们通过分析KiFastCallEntry这个函数来达到第二个条件。
在KiFastCallEntry中,比较重要的代码是上面两句。这两句含义是将0x30赋值给了fs段选择子。
接下来拆解一下0x30这个段选择子所代表的含义
- 0x30=0000000000110 0 00
- 0000000000110代表查GDT表下标为6的项
- 0代表查GDT表
- 00代表0环权限
接下来在windbg中查看GDT表
第六项也就是80b95030的这个位置,这个位置是一个叫KPCR的结构
什么是KPCR
KPCR即Kernel Processor Control Region,处理器控制区域。因为Windows是需要支持多个CPU的,所以为每一个CPU在内核空间安排一个KPCR的结构。用来保存与线程切换相关的全局信息,里面有我们之前说过的TSS。
ring3下,fs寄存器的指向TEB,ring0下,fs寄存器指向KPCR
也就是说push 0x30;pop fs这两条指令的目的是为了让FS寄存器指向KPCR,使线程切换相关的操作能够正常执行。
完善代码
我们之前写的代码开启了中断,接着蓝屏的原因是因为没有对fs进行正确的设置。我们在开中断之前只需要做一个和KiFastCall一样的操作就能建立了安全的线程调度环境。
代码修改如下:
void __declspec(naked) IdtEntry()
{__asm{push 0x30;pop fs;sti;
L: jmp L;iretd;}
}
修改完成以后编译运行,
可以看到现在的情况是程序可以正常运行,虚拟机没有卡死也没有蓝屏,和之前的结果完全不一样。在开启任务管理器,观察我们这个进程
现在这个程序只是一个占用了几乎百分之百的CPU的一个进程,其他的程序还有机会得到执行,因为已经设置好了线程调度环境,允许其他线程访问计算机资源。
而且现在这个进程不管怎么样都结束不掉。原因在于操作系统结束进程的时机是在0环返回3环的瞬间,而我们的程序现在在0环死循环了,没有机会返回到3环,自然也就无法结束了。
完整代码
最后附上完整代码
#include "pch.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>DWORD g_tmp;void __declspec(naked) IdtEntry()
{__asm{push 0x30;pop fs;sti;
L: jmp L;iretd;}
} void go()
{__asm int 0x20;
}//eq 80b95500 0040ee00`00081040
int main()
{if ((DWORD)IdtEntry != 0x401040){printf("wrong addr:%p", IdtEntry);exit(-1);}go();printf("%p", g_tmp);system("pause");
}
Windows内核实验003 再次回到中断相关推荐
- Windows内核实验001 中断提权
文章目录 实验环境 内核提权 IDT的基本知识 什么是中断 什么是IDT表 在PC Hunter中查看IDT表 中断提权的基本原理 写一个三环的小程序 修改IDT表 提权测试 本篇文章基于周壑老师的讲 ...
- Windows内核实验002 中断现场
文章目录 如何获取中断现场环境 中段现场环境 观察中断现场堆栈环境 观察中断现场的寄存器环境 段选择子 段寄存器结构 变化的段寄存器的具体含义 遗留问题:SS段寄存器和栈顶指针来自于哪? 什么是TSS ...
- Windows内核实验004 API调用
文章目录 完善代码 内核API调用 修复一个潜在问题 复现问题 完整代码 前面几次实验我们已经完成了一个三环的程序调用零环API的必要条件. 提升到零环权限 使fs指向KPCR 完善代码 这次我们去掉 ...
- Windows内核实验005 Inline Hook
文章目录 准备工作 寻找Inline Hook的返回地址 编写代码 动态变化的返回地址 JmpTargetAddr Inline Hook基本框架 示例代码 实战HOOK KiTrap01 无需计算偏 ...
- Windows 内核之双机调试与windbg命令大全
在今后会有相当的实验环节,对于windows内核实验,调试环境是必不可少的,本章讲解双机调试的环境搭建与常见的WINDBG指令. 准备材料: VMware workstation : [https:/ ...
- Windows内核新手上路3——挂钩KeUserModeCallBack
Windows内核新手上路3--挂钩KeUserModeCallBack 1. 简介 在Windows系统中,提供了几种方式从R0调用位于R3的函数,其中一种方式是KeUserModeCall ...
- Windows内核加载器概念学习
最近看ReactOS源码分析相关,看到内核加载器概念相关的:原文如下: ReactOS源码分析--内核加载器(一) 计算机BIOS读取硬盘第一个扇区的数据到内存0x7C00位置,将控制权交给主引导记录 ...
- windows 内核情景分析
原文很长:先转部分过来,有时间看一下: 一 windows 内核情景分析---说明 说明 本文结合<Windows内核情景分析>(毛德操著).<软件调试>(张银奎著).< ...
- Windows内核符号表学习总结
内核符号表 http://blog.csdn.net/vbsourcecode/article/details/8555796 在进行Windows Driver开发调试中,内核符号表是个问题.由于网 ...
最新文章
- 使用remoting远程控制编译机
- 关于rc.local启动程序
- 上云实践操作(漫步云端)之上云动力
- SQL2008 附加数据库提示 5120错误
- Linux期末复习编程题
- RxSwift之深入解析场景特征序列的使用和底层实现
- 化验室计算机管理制度,实验室试剂管理制度
- a说b说谎b说c说谎说d说_说谎的眼睛及其同伙
- zipsys驱动签名工具_全球首发 300系列主板USB WIN7 64位驱动 SMXDIY
- python书籍推荐:Python数据科学手册
- 用JavaScript将数字转换为大写金额
- C++ 关联容器set | map | multiset | multimap
- redux相关学习资源
- 自底向上带你逆向解析hibernate联合主键
- VBA实现数据库中的字段处理(下划线去掉,后面的字母变大写)之版本1.0。
- 大数据分析面临哪些困境
- SVM支持向量分类器原理及OpenCV实现
- 微信小程序自定义下拉刷新
- 大批驱动管理软件(免安装版)
- ss和netstat的区别
热门文章
- DL之GRU:GRU算法相关论文、建立过程(基于TF)、相关思路配图集合、TF代码实现
- TF学习——TF之API:TensorFlow的高级机器学习API—tf.contrib.learn的简介、使用方法、案例应用之详细攻略
- DL之RBM:(sklearn自带数据集为1797个样本*64个特征+5倍数据集)深度学习之BRBM模型学习+LR进行分类实现手写数字图识别
- Ubuntu出现卡logo、卡住、黑屏无法正常启动、屏幕和键盘背光无法调节等一系列问题?可能是NVIDIA显卡驱动没装好...
- 多边形填充算法-有序边表法(扫描线算法) 计算机图形学
- 如何解决div层被flash遮盖的问题
- FlashInspector 【Firefox浏览器插件,flash分析工具】
- Vs2010与VC的区别
- linux设备驱动模型 - device/bus/driver
- 用SVR模型完成对Boston房价的回归预测