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


这里写图片描述
图1 修改 U/S 位

运行结果


这里写图片描述

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

总结

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

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值