Windows 内核实验 ——— 多核复杂性
前言
在上一次中断提权实验中,我们采用的是单核,但是我们日常中使用的都是多核,那么同样的在多核中存在有一些特性,本次实验将关注于多核下的一些特性,同样因笔者知识有限,同样可能存在些不正确与不严谨的部分,还请多多指正
实验过程
我们还是一样的环境,因此不需要额外的搭建新的虚拟机,我们将原来的单处理器单内核进行修改
保存后我们启动虚拟机,还是同样的使用 WinDbg 来对其进行调试
我们中断下来时,可以发现多出来了一个 0,那么它是什么呢?还记得吗,我们之前将单内核修改为了 2,不难猜测这个是两个内核中的一个,我们查看 0 号内核的系统中断表
简单观察一下,可以发现其中断表和我们之前提权实验相同,但是我们如果切换到 1 号内核呢,查看其内核
一般来说多个内核会存在有多个寄存器以及中断表,在内核 0 中存在有 eax 等寄存器,那么我们也可以在内核 1 中找到 eax,但是两个的值似乎不太一样,同理于我们将要查看的系统中断表
WinDbg 切换内核
1~1
上述代码为切换到 1 号内核,我们修改波浪线后面的数字便可以切换到对应编号的内核
我们可以观察到在 1 号内核中我们的系统中断表的地址与 0 号内核不一样,但是其地址里对应的内容是相同的,那么问题来了,如果我们对 0 号内核的系统中断表进行修改那么 1 号内核中的中断表会被修改吗?
修改过后我们查看 1 号内核的系统中断表,如下图
对此我们可以发现两个中断表并不一样,我们可以发现两个内核是相互独立的,如果我们拿提权实验的代码在虚拟机执行会怎么样?
1 |
|
需要注意的是我们需要将两个的内核的断点让其恢复,之后再执行对应程序,我们可以看到一下两种现象
为什么会出现上述情况?
在操作系统中两个内核是并行运行的,我们之前修改了 0 号内核,而未修改 1 号内核,当 CPU 调度 0 号内核运行时,那么我们便会打印出对应的地址值,而当调用 1 号内核时,因为我们没有修改中断表,因此无法实现提权的过程进而无法打印出对应地址处的值了
我们尝试在中断处理函数中将一些东西写入到内核中的地址去
1 |
|
当我们调用IdtEntry2
函数时虚拟机会出现卡死状态,同时调试器自动断下,我们此时产生异常信息
同时我们查看对应地址,可以发现已经成功修改了对应地址处值
同时我们已经无法切换到对应的虚拟机中了
上述过程说明了一个内核将我们的地址处的内容进行修改,当另一个核执行到此处时发生异常,也同样说明我们在多核下对内核的函数挂钩的难度较大,以及关闭分页保护进行写入是不安全的
总结
我们此处开启了多核进行调试观察,我们可以简单的了解到在多核下内核与内核之间是并行关系,CPU通过调度来进行处理多核。我们也可以注意到多核下有许多相同的东西,且是相互独立的,我们修改其中一个内核的中断表而查看另一个的发现并没有变动,但是我们将其写入内存时便可以发现对应部分都被修改了,以此窥见多内核下的复杂性