23-不提权读取高2G内存

我知道,就算我不写这篇文章,你也知道怎么做。可是,不管怎样,我还是得让这篇博客刷刷访问量。

测试代码

int main(int argc, char* argv[])
{
    int *p = (int*)0x8003f00c;
    getchar();
    printf("%08x\n", *p);
    return 0;
}

实验

修改 PDE、PTE

上面的测试代码在 VC6.0 中编译,然后运行。当程序停在 getchar() 的时候,中断到 WinDbg.

线性地址 8003f00c拆分成3段后是200-03f-00c


23-不提权读取高2G内存_第1张图片
图1 修改 U/S 位

运行结果


23-不提权读取高2G内存_第2张图片

注意,单纯的修改 U/S 位(原来的属性 163 改成 167)可能仍然会报错,但是这不是一定会报错,只有少数人会成功运行。如果你的程序报错了,最保险的做法就是把属性PDE和PTE中的 G 位也清 0. 即按照图1 的做法,把163改成067。

总结

如今,我们已经知道可以不提权,也能读写高 2G 的内存了,可是这只是实验演示。操作系统中读写高 2G 当然不会这么干,如果高 2G 所有的 U/S 属性位全部变 1,那系统就没有任何安全性可言了。

虽然如此,可是我们还是想玩玩,如何把整个进程 4GB 空间的地址所有的 U/S 位全部改成 1……

你可能感兴趣的:(OS,学习笔记,OS修炼指南之保护模式)