[保护模式]联系1 三环访问高2G

// 三环读高两G.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>

int _tmain(int argc, _TCHAR* argv[])
{

    int* gdtAddress = NULL; //定义个变量
    getchar();
    gdtAddress = (int*)0x80b95048; //复制一个高地址
    *gdtAddress = 2; 
    printf("%x,value =%x
", gdtAddress,*gdtAddress);
    system("pause");
    return 0;

 

}

会出现读取失败,那么此时我们需要借助Windbg来辅助操作!

首先找到

0x80b95048地址
将他改写

0: kd> eq 80b95048 00000000`12345678
0: kd> dq gdtr
80b95000 00000000`00000000 00cf9b00`0000ffff
80b95010 00cf9300`0000ffff 00cffb00`0000ffff
80b95020 00cff300`0000ffff 80008b1e`600020ab
80b95030 84409333`dc003748 0040f300`00000fff
80b95040 0000f200`0400ffff 00000000`12345678
80b95050 84008933`b0000068 84008933`b0680068
80b95060 00000000`00000000 00000000`00000000
80b95070 800092b9`500003ff 00000000`00000000

 
   
拆分
0x80b95048地址
拆分后:‭1000 0000 1011 1001 0101 0000 0100 1000‬
根据 2 9 9 12的物理页进行重组
因为结构大小为8位,如果要定义到目录还需乘它的位数
2位 :10 2*8 (0a9f4801 )

9位:00 0000 101    5*8 (00193063 )

9位:1100 1010 1    195*8 (00b95163 )
12 位:0000 0100 1000‬  48   (123456)这里已经到了具体指向数据了,所以它并不需要再乘位在虚拟机内运行程序,断在GETchar 然后再用Windbg接管
使用!process 0 0 来遍历所有进程   (如果需要读物理地址那么前面加个!)
填写000 则是为了防止读写属性参与运算!

0: kd> !dq beaf6220+2*8
#beaf6230 00000000`0a9f4801 00000000`0acf5801
#beaf6240 00000000`5d0ab801 00000000`5d8ac801
#beaf6250 00000000`5d8ad801 00000000`5d6ae801
#beaf6260 00000000`5c6b8801 00000000`5c4b9801
#beaf6270 00000000`5beba801 00000000`5c4bb801
#beaf6280 00000000`5dbc1801 00000000`5e0c2801
#beaf6290 00000000`5e1c3801 00000000`5e3c4801
#beaf62a0 00000000`5989e801 00000000`5919f801

0: kd> !dq 0a9f4000+5*8
# a9f4028 00000000`00193063 00000000`b6a02863
# a9f4038 00000000`00000000 00000000`001c2063
# a9f4048 00000000`001c3063 00000000`001c4063
# a9f4058 00000000`001c5063 00000000`001c6063
# a9f4068 00000000`001c7063 00000000`001c8063
# a9f4078 00000000`001c9063 00000000`001ca063
# a9f4088 00000000`001cb063 00000000`001cc063
# a9f4098 00000000`001cd063 00000000`001ce063

0: kd> !dq 00193000 + 195*8
#  193ca8 00000000`00b95163 00000000`00000000
#  193cb8 00000000`00000000 00000000`00000000
#  193cc8 00000000`00000000 00000000`00000000
#  193cd8 00000000`00000000 00000000`00000000
#  193ce8 00000000`00000000 00000000`00000000
#  193cf8 00000000`00000000 00000000`00000000
#  193d08 00000000`00000000 00000000`00000000
#  193d18 00000000`00000000 00000000`00000000

0: kd> !dq 00b95000 +48
#  b95048 00000000`12345678 84008933`b0000068
#  b95058 84008933`b0680068 00000000`00000000
#  b95068 00000000`00000000 800092b9`500003ff
#  b95078 00000000`00000000 00000000`00000000
#  b95088 00000000`00000000 00000000`00000000
#  b95098 00000000`00000000 87008905`2f980068
#  b950a8 00000000`00000000 00000000`00000000
#  b950b8 00000000`00000000 00000000`00000000

原代码:

a9f4028 00000000`00193063    3拆分后是0011   属于超级用户才能访问

!ed a9f4028 00193067    7拆分后0111    
把PDE第二位设置位普通用户

就是一层层的把超级权限改成用户权限!
原文地址:https://www.cnblogs.com/hanhandaren/p/11225817.html