首页
社区
课程
招聘
[原创]win7 sp1 将 0x80000000 ~ 0xFFFFE000 地址修改成可读可写
发表于: 2020-11-2 23:01 3526

[原创]win7 sp1 将 0x80000000 ~ 0xFFFFE000 地址修改成可读可写

2020-11-2 23:01
3526

环境: 

win7 x86 sp1 专业版

vs 2008

101012分页

windbg修改: 

中断门: eq  80b99400 + (0x20 * 8) 0040EE00`00081000


注意:

//0xFFFFE000 只能改到这里 后面据说硬件地址 反正我的代码非死及蓝 


PS:

代码很多地方可以有优化, 但是比较懒就没弄, 嘿嘿! 

pde = 0xc0300000 + pdi * 4

pte = 0xc0000000 + pdi * 4096 + pti * 4


#include#includeint startAddress = 0;
int endAddress = 0;


void __declspec(naked)Func()
{

	__asm{

		//int 3;
		pushad;
		pushfd;
		push fs;
		mov ax,0x30;
		mov fs,ax;


		jmp funcStart;

		//p位 = 0 找下一页
whileStart:
		mov eax,startAddress;
		mov edx,endAddress;
		cmp eax,edx;
		jz funcEnd; // 开始 结束相等结束程序 修改完毕


		mov ecx,0x1000;
		add ecx,startAddress;
		mov startAddress,ecx;

		//程序开始
funcStart:
		mov ebx,startAddress;
		shr ebx,14h;
		and ebx,0ffch;
		sub ebx,3FD00000h;
		mov eax,[ebx];//取pde 得值

		test al,1;
		jnz PisTrue;
		jmp whileStart;

		//p位 ok
PisTrue:
		test al,al;
		jns PSIsTrue;
		jmp whileStart;//跳到开始位置

		//ps位 = 1 
PSIsTrue:
		or [ebx],7h;

		mov ebx,startAddress;
		shr ebx,0Ah;
		and ebx,3FFFFCh;
		sub ebx,40000000h;
		mov eax,[ebx]; //取出pte
		test al,1;
		jz whileStart;

		//修改pte属性
		or [ebx],7h;
		jmp whileStart;

funcEnd:

		pop fs;
		popfd;
		popad;

		mov eax,cr3;
		mov cr3,eax;


		iretd;
	}
};

int main(void)
{
	printf("%x\n",Func);

	startAddress = 0x80000000;
	endAddress = 0xFFFFE000;
	int* address = (int*)0xC0300000;

	system("pause");

	__asm{
		push fs;
		int 0x20;
		pop fs;
	}

	printf("%x\n",*address);

	system("pause");

	return 0;
}

29912 代码

pde =  pdpte  * 512 * 8 + pdi * 8 + C0600000

pte = pdpte  * (512 * 8) + pdi * (512*8) + C0000000

#include#includeint startAddress = 0;
int endAddress = 0;


void __declspec(naked)Func()
{

	__asm{

		//int 3;
		pushad;
		pushfd;
		push fs;
		mov ax,0x30;
		mov fs,ax;


		jmp funcStart;

		//p位 = 0 找下一页
whileStart:
		mov eax,startAddress;
		mov edx,endAddress;
		cmp eax,edx;
		jz funcEnd; // 开始 结束相等结束程序 修改完毕


		mov ecx,0x1000;
		add ecx,startAddress;
		mov startAddress,ecx;

		//程序开始
funcStart:
		mov ebx,startAddress;
		shr ebx,12h;
		and ebx,3FF8h; 2 * 512 * pde * 4
		sub ebx,3FA00000h;
		mov eax,[ebx];//取pde 低8位
		mov edx,[ebx + 4]; //pde 高8位

		test al,1;
		jnz PisTrue;
		jmp whileStart;

		//p位 ok
PisTrue:
		test al,al;
		jns PSIsTrue;
		or [ebx],7h;   //大页我也修改
		jmp whileStart;//跳到开始位置

		//ps位 = 0
PSIsTrue:
		or [ebx],7h;

		mov ebx,startAddress;
		shr ebx,9;
		and ebx,7FFFF8h;
		mov edx,[ebx - 3FFFFFFCh]; //pte 高四位
		sub ebx,40000000h;
		mov eax,[ebx]; //取出pte 低四位
		test al,1;
		jz whileStart;

		//修改pte属性
		or [ebx],7h;
		jmp whileStart;

funcEnd:

		pop fs;
		popfd;
		popad;

		mov eax,cr3;
		mov cr3,eax;


		iretd;
	}
};

int main(void)
{
	printf("%x\n",Func);

	startAddress = 0x80000000;
	endAddress = 0xFFFFE000;
	int* address = (int*)0xC0600000;

	system("pause");

	__asm{
		push fs;
		int 0x20;
		pop fs;
	}

	printf("%x\n",*address);

	system("pause");

	return 0;
}



[课程]Linux pwn 探索篇!

最后于 2020-11-4 23:31 被清风qfccc编辑 ,原因: 更新29912分页
收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 3102
活跃值: (3623)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
掌握了段页的知识,所有内存都能随便揉拧
2020-11-3 22:10
0
雪    币: 305
活跃值: (403)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
Mr.hack 掌握了段页的知识,所有内存都能随便揉拧
嘿嘿
2020-11-4 22:35
0
雪    币: 477
活跃值: (1412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
ring3么
2020-11-4 22:59
0
雪    币: 46
活跃值: (1700)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
没有什么难的,段和页的知识而已。
2020-11-4 23:18
0
雪    币: 305
活跃值: (403)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
cheating 没有什么难的,段和页的知识而已。
大佬求带
2020-11-4 23:21
0
雪    币: 305
活跃值: (403)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
需要 提取
2020-11-4 23:22
0
游客
登录 | 注册 方可回帖
返回
//