// 三环读高两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\n", gdtAddress,*gdtAddress); system("pause"); return 0; }
会出现读取失败,那么此时我们需要借助Windbg来辅助操作!
首先找到
0x80b95048地址
将他改写
0: kd> eq 80b95048 00000000`12345678 |
|
拆分
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第二位设置位普通用户
就是一层层的把超级权限改成用户权限!