【Windows内核】(7)调用门提权(无参)
调用门提权(无参)
对调用门的调用可以访问与当前代码特权相同或者特权更高的代码段中的过程。
调用门执行流程:
指令格式:CALL CS:EIP(EIP是废弃的)
执行步骤:
-
根据CS的值 查GDT表,找到对应的段描述符 这个描述符是一个调用门.
-
在调用门描述符中存储另一个代码段段的选择子.
-
选择子指向的段 段.Base + 偏移地址 就是真正要执行的地址.
门描述符:

P=1 S=0 Type = 1100 是一个可用的门描述符
Offset存的是EIP
Segment Selector是另一个代码段的段选择子
构造一个调用门
查GDT表内容

看到8003f048处是一串0 我们要把门描述符写在这个地址
为了使用调用门提权 我们需要创建一个门描述符
该调用门描述符的偏移字段指向我们定义的函数,提权后该函数的执行权限就能变成0环
该调用门描述符的段选择子要指向某个系统代码段,这里选择8003f008
则该选择子要设置为00001000 = 0x8
该调用门的描述符中DPL设为3 P位为1 S位为0 TYPE固定为0xE 这儿是无参调用 所有高4字节的低8位设置为0
除偏移字段外 调用门描述符暂时为0000EC00 00080000
接下来确定函数的地址

进入反汇编 查看函数地址

构造完整的调用门描述符0040EC00 00081020并写入8003f048

回到程序 开始调试

我们可以看到调用前ESP = 0012FF28 CS = 001B SS = 0023
继续执行 程序断在了INT 3
可以看到此时的EIP已经成了401020 说明确实跳转到了我们定义的函数里

CS = 0x8是我们选择的代码段的段选择子 SS = 0x10和之前看到的0x23不同 确实导致了堆栈切换
至此 我们成功的通过了调用门,调用了我们定义的函数
现在 打开内存窗口,验证一下与之前画的跨段并提权的堆栈图是否正确

[ESP]储存的是返回地址 [ESP-4]是调用者的CS也就是1B [ESP-8]是三环的ESP [ESP-C]是 0x23是原来的SS与堆栈图相同


浙公网安备 33010602011771号