-
-
调用们提权访问页表,发送了缺页异常导致错误
-
发表于: 2020-10-27 20:35 3008
-
// 拆分4GB内存.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <Windows.h>
typedef struct Attrbute{
int P;
int US;
int RW;
}ATTRBUTE;
typedef struct PdeToPte{
int LinAddress;
int PDEAddress; //PDE的地址
int PTEAddress; //PTE的地址
int PDELowData; //PDE地址处存储的值
int PDEDHighata;
int PTELowData; //PTE地址处存储的值
int PTEDHighata;
ATTRBUTE PDEAttrubte;
ATTRBUTE PTEAttrubte;
}PDETOPTE;
PDETOPTE Page;
void MmIsAddressValid(){
Page.PDEAddress=0xC0600000+((Page.LinAddress>>18)&0x3FF8);
Page.PTEAddress=0xC0000000+((Page.LinAddress>>9)&0x7ffff8);
}
void ReSolve(){
Page.PDEAttrubte.P =(Page.PDELowData&0x1);
Page.PDEAttrubte.RW=(Page.PDELowData&0x2)>>1;
Page.PDEAttrubte.US=(Page.PDELowData&0x4)>>2;
1 2 3 | Page.PTEAttrubte.P = (Page.PTELowData& 0x1 ); Page.PTEAttrubte.RW = (Page.PTELowData& 0x2 )>> 1 ; Page.PTEAttrubte.US = (Page.PTELowData& 0x4 )>> 2 ; |
}
void _declspec(naked) print(){
__asm{
//int 3
pushad
pushfd
mov eax,Page.PDEAddress
mov ecx,[eax];
mov eax,[eax+4]
mov Page.PDELowData,ecx
mov Page.PDEDHighata,eax
1 2 3 4 5 6 7 8 9 10 | mov eax,Page.PTEAddress mov ecx,[eax] mov eax,[eax + 4 ] mov Page.PTELowData,ecx mov Page.PTEDHighata,eax popfd popad retf } |
}
int main(int argc, char argv[])
{
char buf[6];
char Item[256];
DWORD len=0;
HANDLE HFile=CreateFile(".//taolaoda.txt",GENERIC_ALL,FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(INVALID_HANDLE_VALUE==HFile ){
MessageBox(0,0,"123",MB_OK);
}
((WORD*)&buf[4])=0x48;
printf("print=%p\n",print);
//getchar();
for(int i=0;i<0xFFFFE000;i+=0x1000){
printf("i=%p\n",i);
if(i==0x00C00000){
int a=10;
}
MmIsAddressValid();
__asm{
call fword ptr buf;
}
ReSolve();
memset(Item,0,sizeof(Item));
1 2 3 4 5 6 7 8 9 10 | sprintf(Item, "LineAddr=%p PDE=%p`%p P=%01x US=%01x RW=%01x PTE=%p`%p P=%01x US=%01x R/W=%01x \r\n" , Page.LinAddress,Page.PDEDHighata,Page.PDELowData,Page.PDEAttrubte.P,Page.PDEAttrubte.RW,Page.PDEAttrubte.US, Page.PTEDHighata,Page.PTELowData,Page.PTEAttrubte.P,Page.PTEAttrubte.RW,Page.PTEAttrubte.US); WriteFile(HFile,Item,strlen(Item),& len ,NULL); Page.LinAddress + = 0x1000 ; } CloseHandle(HFile); getchar(); return 0 ; |
}
通过打印信息在if(i==0x00C00000){int a=10; }进入调用们提权后
访问页表
可以看到C0006000地址没有挂物理页,执行F11跳到了另外一个地址
此时C0006000挂上了物理页,一直单步到最后发现
这个iretd计算要返回也是返回,4010ac的下一行啊,结果堆栈都是乱的,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | pushad pushfd mov eax,Page.PDEAddress mov ecx,[eax]; mov eax,[eax + 4 ] mov Page.PDELowData,ecx mov Page.PDEDHighata,eax mov eax,Page.PTEAddress mov ecx,[eax] 这一行出得缺页异常 这后面都没有执行 mov eax,[eax + 4 ] mov Page.PTELowData,ecx mov Page.PTEDHighata,eax popfd popad retf |
本人无论如何都想不通为什么是这样,求教
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)