windows内核-调用门的实现

调用门

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:调用门


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

调用门无参的实现


提示:以下是本篇文章正文内容,下面案例可供参考

一、windbg查看GDTR表,查看cs=1b即18出的描述符
如图知道描述符为:00cffb00~0000ffff
5.4调用门

在这里插入图片描述

用指令eq 修改C0处用于构建调用门,
在这里插入图片描述

还要修改c8处的内容,从1B中复制过来,调用门要跳到C8处指向

预备知识

这里对调用门中门描述符表的一般格式做一个说明
门描述符我们可以看成是一个结构体,这里用汇编进行定义,方便各位同学看官理解

Gate struct ;门结构类型定义
offsetl dw 0 ;32位偏移的低16位
selector dw 0;选择子
dcount db 0;计数器
gtype db 0 ;门类型说明
offseth dw 0 ;32位偏移的高16位
Gate ends

这里在对gtype进行定义

Gtype struct ;门类型说明
P   1 bit 0 ;存在位
DPL 2 bit 0 ;特权级
TD0 1 bit 0 ;存储段和系统段选择位,为0是系统段和前面描述符表类似
TYPE 4 BIT 0 ;门描述符的编码类型
Gtype ends 

类型定义完了。我们看在本例子中,我们提供的门描述符的信息,
0040ec00`00cb1020
offseth = 0040
offsetl = 1010
dword = 0
selector = cb ------cbh = b1100 1011,表面从权限是R3,从GDT表中查找,查找表B8处
gtype = ec
其中gtpye在进行拆分 1110 1100
P = 1;
dpl = 3 = r3
DT0= 0,系统段
1100 = c,查表知道是386调用门的编码
基于上面分析得出下面结论,需要做如下处理

1、无参数传递,jmp跨段远跳转,R3未提权

2、调用门0040ec00`00cb1020写入GDT表0xc0处,0x00cb 0xc8处的R3选择子

3、将GDT表0x18(CS=0X1B)处的CS段描述符复制到GDT表0xc8处代码段描述符

根据代码我们需要在C0出写入调用门C0处。没有做提权处理,

上测试代码

4,代码

/*程序名:test8_1.c*/
/*
无参调用门跳转,未提权R3权限
*/
#include <stdio.h>
#include <windows.h>
int t ;
int func()//0X00401020
{
	int a = 1,b = 2;
	return (a+b);
}
int main(int argc,char*argv[])
{
	char buff2[6];
	*(WORD*)&buff2[4] = 0xc3;

	_asm call fword ptr[buff2]
	_asm add esp,4
	_asm mov t,eax


	printf("a+b=%d\n",t);
	return 0;
}

5, 实验现象

在这里插入图片描述

总结:

1,这里如果不进行调用门的调整,指向是没法执行的,如果大家不装windbg本代码,执行汇报05从错误
2,本套课程需要有汇编基础

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值