首页
社区
课程
招聘
调用们提权访问页表,发送了缺页异常导致错误
发表于: 2020-10-27 20:35 3008

调用们提权访问页表,发送了缺页异常导致错误

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期)

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//