cs里的是一个段选择子
1:拆分段选择子,查GDT表
2:该段描述符为系统描述符,s位为0,TYPE为1100,是一个门描述符(DPL必须为3,不然该描述符的权限检查过不去)
3:该描述符的16到31位为另外一个段描述符的选择子(决定是否提权)
门描述符
当段描述符是门描述符时,高16位与低16位组成一个32的地址。是程序通过门后代码执行的地址。16到31位是一个段选择子,决定是否提权。
自己实现调用门
//读取高地址的值
#include "stdafx.h"
#include <windows.h>
int a=0;
void _declspec(naked) test()
{
_asm
{
pushad
pushfd
mov eax,0x8003f048
mov ebx,[eax]
mov a,ebx
popfd
popad
retf
}
}
int main(int argc, char* argv[])
{
char buffer[6]={0};
*(DWORD*)&buffer[0]=0;
*(DWORD*)&buffer[4]=0x4b;
_asm
{
call fword ptr [buffer]
}
printf("a=%x\n",a);
getchar();
return 0;
}
构造一个门描述符写入GDT表 。