kd> p
001b:00c91874 ff5dfa call fword ptr [ebp-6]
kd> r
eax=00000001 ebx=7ffd6000 ecx=0012f9ec edx=778570b4 esi=0012f9f8 edi=0012fb18
eip=00c91874 esp=0012f9e0 ebp=0012f9f0 iopl=0 nv up ei pl nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000202
001b:00c91874 ff5dfa call fword ptr [ebp-6] ss:0023:0012f9ea=016800000000
kd> t
0170:80b95148 c3 ret
kd> r
eax=00000001 ebx=7ffd6000 ecx=0012f9ec edx=778570b4 esi=0012f9f8 edi=0012fb18
eip=80b95148 esp=97eb7ca0 ebp=0012f9f0 iopl=0 nv up ei pl nz na po nc
cs=0170 ss=0010 ds=0023 es=0023 fs=003b gs=0000 efl=00000202
0170:80b95148 c3 ret
kd> t
0170:00c91877 8f45fc pop dword ptr [ebp-4]
kd> r
eax=00000001 ebx=7ffd6000 ecx=0012f9ec edx=778570b4 esi=0012f9f8 edi=0012fb18
eip=00c91877 esp=97eb7ca4 ebp=0012f9f0 iopl=0 nv up ei pl nz na po nc
cs=0170 ss=0010 ds=0023 es=0023 fs=0038 gs=0000 efl=00000202
0170:00c91877 8f45fc pop dword ptr [ebp-4] ss:0010:0012f9ec=01680000
以上内容是用windbg调试的调用门, 调用门执行的代码只有一句 ret。 并且该调用门函数没有任何输入参数。
正常的提权调用门是应该用 retf 返回的,这里故意用ret返回。
可以看到 在通过调用门进入Ring0后,cs,eip,ss,esp都被修改了,但是ebp没有被修改,这是因为我们的调用门函数里面没有 push ebp; mov ebp esp 这样的操作。
通过ret返回到Ring3后,再看。发现只有eip恢复到了Ring3层的值,而cs,ss,esp都停留在了Ring0层的值。这种情况下,cs就有了Ring0权限。可以执行一些特殊代码。
后面还可以通过ebp把占恢复到Ring3状态。