调用门
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:调用门
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
调用门无参的实现
提示:以下是本篇文章正文内容,下面案例可供参考
一、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,本套课程需要有汇编基础