提权调用门 ret返回测试

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状态。

猜你喜欢

转载自blog.csdn.net/m0_37921080/article/details/82597196