栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

中断门实验(一)打印任意地址(中断提权)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

中断门实验(一)打印任意地址(中断提权)

 idt是中断描述表,idt表包含了三种描述符:任务门,中断门,以及陷阱门

本文是通过修改idt表中的0x20号中断,增加了自己的中断门

 每一个idt表项中的 前2个字节+后2个字节(Offset31..16+Offset15..0=EIP)这个地址是当权限符合以后跳转到这个地址执行。

权限符合:

这里举一个例子 :   mov eax, dword ptr ds : [0x8003f500]

(1.找出选择子->2.查找IDT或者GDT表->3.找出描述符->4.根据描述符里的属性加载)

如果符合就运行这行汇编代码

 

 当前可以看见中20号中断的地址为空

 

 我们可以在8003f500插入自己构造的中断门,0040ee00`0008100f ,前两个字节+后两个字节=EIP(0040100f)也就是下面IdtEntry这个函数的地址 ee00`0008则是属性位,当权限符合后跳转到这个函数

 

#include "stdafx.h"


#include
DWORD g_tmp = 0;
//declspec(naked)是编译器直接拿来用的汇编函数代码,所以一定要记得在开始的时候保存上下文标志位(压栈),在结束的时候要记得恢复上下文(出栈)。并且在结尾要加上ret命令
void  __declspec(naked) IdtEntry()
{
	__asm {
		mov eax, dword ptr ds : [0x8003f500]
		mov g_tmp, eax
		iretd
	}

}
void go() {
	__asm int 0x20;
	
}

int main()
{
	if ((DWORD)IdtEntry != 0x40100f)
	{
		printf("wrong addr:%p", IdtEntry);
		getchar();
		
	}
	go();
	printf("%pn", IdtEntry);
	printf("%pn",g_tmp);
	getchar();

	return 0;
}

把高地址的内容打印出来:

如有不足的地方,请予以指正

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/510940.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号