ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1.3 window内核——调用门

2021-10-09 20:35:07  阅读:147  来源: 互联网

标签:调用 1.3 window 地址 描述符 内核 跳转 CS 执行


调用门起的过度的作用,3环的程序经过调用门再到0环中运行指定命令,再出0环回到程序执行

调用门执行流程

指令格式:CALL CS:EIP(EIP是废弃的)
执行步骤:

1) 根据CS的值 查GDT表,找到对应的段描述符  这个描述符是一个调用门.
2) 在调用门描述符中存储另一个代码段段的选择子.
3) 选择子指向的段  段.Base + 偏移地址 就是真正要执行的地址.

门描述符

门描述符
注意:

1. S位(第12位)必须为0,只有当S位为0时,段描述符才是系统段描述符;此时,当Type域为1100时,该描述符是门描述符
2. 低四字节的16~31位是决定 调用的代码存在于哪个段 的 段选择子
3. 当长调用执行时:真正要执行的代码地址=门描述符中段选择子所指向的代码段的Base+门描述符高四字节的16~31位+门描述符低四字节的0~15位
4. 每个线程两个堆栈,一个三环的一个零环的

举个例子

1.无参数

写一个函数,要在主程序运行时运行此程序

void __declspec(naked) NoArg()
{
	__asm
	{
	int 3  //中断,便于调试
	mov eax,0x12345678
	retf
	}
}

NoArg函数地址在 0x00401030
NoArg函数地址

写个主函数

int main(int argc, char* argv[])
{
	SegVal segval = {0,0x4b} // SegVal是自己定义一个结构体,0为EIP,0x4b为段选择子
	__asm
	{
	call fword ptr [segval]
	}
}

我们拆开0x4b这个选择子
b01001011
index:01001 索引为9
TI:0 在GDT表中
RPL:11 特权等级为3
寻找指定位置
在这里插入图片描述
850082df’70001827即为该位置的信息,正常的应该是以此为段描述符跳转到相应位置,我们修改它,使之跳转到我们定义的函数地址运行
按照门描述符的格式修改为0040EC00 00081030,即可跳转到00401030的位置,然后执行函数,修改eax为0x12345678.
其中EC00 为调用门的格式,DPL为3与主程序的权限相同 ;0008是特权等级为0,访问的是0环的
2.有参数
修改EC00有几个参数就将Param Count修改成几
例如三参数的改为EC03

3、调用门总结:

  1. 当通过门,权限不变的时候,只会PUSH两个值:CS 返回地址
    新的CS的值由调用门决定

  2. 当通过门,权限改变的时候,会PUSH四个值:SS ESP CS 返回地址 新的CS的值由调用门决定 新的SS和ESP由TSS提供

  3. 通过门调用时,要执行哪行代码有调用门决定,但使用RETF返回时,由堆栈中压人的值决定,这就是说,进门时只能按指定路线走,出门时可以翻墙(只要改变堆栈里面的值就可以想去哪去哪)

标签:调用,1.3,window,地址,描述符,内核,跳转,CS,执行
来源: https://blog.csdn.net/kmic1/article/details/120677515

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有