调用门的分析--提权读取内核
在上一篇文章中我使用了JMP FAR 进行了读取高内核中的一致代码段然而并不能读取非一致代码段,这也使得JMP FAR 有点尴尬
不过JMP FAR 并功能不只是一个功能。JMP FAR 有四种情况可以跳转:代码段,调用门,TSS任务段,任务门;
通过这篇文章,我们可以通过学习调用门从而了解到JMP FAR 到调用门(其实大概都一样,不过CALL FAR 涉及到堆栈的变化,JMP FAR 显得简单点了)
调用门执行流程入下
操作指令:CALL CS:EIP(EIP是废弃的)
执行步骤:
- 根据CS的值 查GDT表,找到对应的描述符 - 描述符是一个调用门
- 在调用门的描述符中存储另一个代码段的选择子
- 选择子指向的段 段.Base + 偏移地址 就是真正要执行的地址
在描述符中 Param.Count 表示压入多少个参数。(在测试中 我发现其实就是根据这个值开辟出多个堆栈空间)
根据调用门的描述符,我构建了如下 0040EC02`00081020
我这得Segment Selector 指向了08的代码段选择子 (08指向的是一个代码段描述符,如果你不爽 可以自行构造)
偏移为:00401020 (指向了我的函数)
并且压入了两个参数 Count = 2
具体代码如图:
由此可见,在CALL进行后,CS 的特权级别已经到了0环(0x8 = 10 00 )
从而实现了一个从3环到0环 进行内核数据的读写
在根据windbug 提供的数据来看
b2338dc4 00000000 0040b532 0000001b 00000002
b2338dd4 00000001 0012ff24 00000023 80541fa2
b2338de4 f89a50ae 81d9d0e8 00000000 0000027f
在切换至0环的堆栈后,CPU会依次将 SS ESP 参数1 参数2 CS 返回地址 压入堆栈
在以上压入的值中,SS ESP 由TSS 填入,ESP决定了在函数执行后我们返回到哪个地方(当然,这里我们可以修改掉,跳到自己想到的地方)。
在后续的学习文章中 我会在任务门的时候记录TSS的相关文章;
在当前的windows 操作系统中,并没有使用调用门。
但不代表我们不能用~
以下是相关的堆栈图,同学们也可以看看。如有错请联系我,再进行修改并检讨。