10 调用门

1.调用门的执行流程
指令格式:CALL FAR CS:EIP(EIP是废弃的)
执行步骤:
<1>根据CS的值,查找GDT表,找到相应的段描述符,这个段描述符是一个调用门
<2>在调用门中存有另一个代码段的段选择子和偏移值
<3>段选择子指向的段的Base属性和调用门中存的偏移值相加得到要执行代码的地址
2.门描述符
门描述符结构如下,其结构可以在架构手册2388页找到,当一个段描述符的S位0且Type域为1100时表示一个门描述符。
在这里插入图片描述
代码执行时,先从门描述符中根据其结构中的段选择子找到相应的段,取出Base属性再加上门描述符中的偏移值。
下面我们做个门描述符的实验:
首先我们构造一个门描述符:
0000EC00 00080000
接下来我们在虚拟机里面用下面的代码做相应的测试

#include <stdio.h>
#include <windows.h>

//__declspec(naked)是用来告诉编译器函数代码的汇编语言为自己的所写,不需要编译器添加任何汇编代码
void _declspec(naked)GetRegister()
{
	_asm{
		int 3	//就做一个简单的中断,这里如果断下来会断到零环调试器
		retf
	}
}

int main()
{
	char buffer[6];
	*(DWORD*)&buffer[0] = 0x12345678;//这四个字节为EIP的值,可以随便写
	*(WORD*)&buffer[4] = 0x48;//这个用来填CS不能随便写,最后要用来查找我们加入的门描述符
	_asm{
		call fword ptr[buffer];
	}
	return 0;
}

我们在char buffer[6]语句处下断点,然后反汇编记录GetRegister的地址0x00401020,现在我们修正我们构造的调用门描述符 为:0040EC00 00081020
然后我们用windbg将构造的门描述符写入GDT表中,一次执行的指令为:
r gdtr
dq 8003f000
eq 8003f048 0040EC00 00081020
然后我们切换到XP中在char buffer[6];语句处下断点并执行我们的程序,然后记录调用GetRegister前的各寄存器值,如下图:
在这里插入图片描述
接下来我们继续执行代码,然后发现其在Windbg中断下如下图:
在这里插入图片描述
这时我们观察一下寄存器的值,如下图:
在这里插入图片描述
我们在来看看堆栈里的数据:
在这里插入图片描述
可以看到此时的堆栈中就是我们调用函数前的SS ESP CS的值。
那我们在这个函数中是不是可以做0环才能做的事情呢,应该是可以的,下面我们修改上面的代码如下:

#include <stdio.h>
#include <windows.h>

BYTE GDT[6] = {0};
DWORD dwH2GValue;

//__declspec(naked)是用来告诉编译器函数代码的汇编语言为自己的所写,不需要编译器添加任何汇编代码
void _declspec(naked)GetRegister()
{
	_asm{
		pushad//保存一堆寄存器
		pushfd//保存标志位寄存器
		mov eax,0x8003f00c//读取高2G内存
		mov ebx,[eax]
		mov dwH2GValue,ebx
		sgdt GDT	//读取GDT
		popfd
		popad
		retf
	}
}

void PrintRegister()
{
	DWORD GDT_ADDR = *(PDWORD)(&GDT[2]);
	WORD GDT_LIMIT = *(PWORD)(&GDT[0]);
	printf("%x %x %x\n", dwH2GValue, GDT_ADDR, GDT_LIMIT);
}

int main()
{
	char buffer[6];
	*(DWORD*)&buffer[0] = 0x12345678;//这四个字节为EIP的值,可以随便写
	*(WORD*)&buffer[4] = 0x48;//这个用来填CS不能随便写,最后要用来查找我们加入的门描述符
	_asm{
		call fword ptr[buffer];
	}
	PrintRegister();
	return 0;
}

然后我们在char buffer[6];下断点反汇编窗口记录GetRegister的地址,然后重新构造门描述符写入GDT表中eq 8003f048 0040EC00`0008B4D0 接着我们执行程序,可以看到我们的程序有了0环的权限,读取了GDT的base和limit还读取了高2G的地址空间的值。效果如图:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lifeshave/article/details/86531103