Windows内核之读取0地址

admin 2021年5月12日10:35:18评论53 views字数 2408阅读8分1秒阅读模式
前言


    在三环应用层开发中,虚拟地址的0地址是无法访问的,而今天通过在内核层零环进行操作0地址。


1.实现过程

        在C语言中,简单看下方的例子:可能很多实际开发都会用到这样的判断。而NULL就是地址0的地方。

char * buffer = (char*)0;if(buffer==NULL){  cout << "为NULL"<<endl;}

    那么如何来进行操作0地址的地方呢?可以看下方的图,PTE对应的就是物理页。

    例如定义一个变量X,将变量X的PTE赋给0地址的PET即可。

    Windows内核之读取0地址


2.

    首先获取变量X的地址

       

Windows内核之读取0地址

之后进行获取程序CR3,首先获取PDE.然后55ebe867 即为PTE


kd> !dd 5650a000 //获取PDE#5650a000 5eb36867 53eb5867 00000000 00000000#5650a010 00000000 00000000 00000000 00000000#5650a020 00000000 00000000 00000000 00000000#5650a030 00000000 00000000 00000000 00000000#5650a040 00000000 00000000 00000000 00000000#5650a050 00000000 00000000 00000000 00000000#5650a060 00000000 00000000 00000000 00000000#5650a070 00000000 00000000 00000000 00000000kd> !dd 5eb36000+12f*4 //获取PTE#5eb364bc 55ebe867 179c3025 175c4025 179c5025#5eb364cc 17646025 00000000 00000000 00000000#5eb364dc 00000000 00000000 00000000 00000000#5eb364ec 00000000 00000000 00000000 00000000#5eb364fc 00000000 5643a867 00000000 00000000#5eb3650c 00000000 00000000 00000000 00000000#5eb3651c 00000000 00000000 00000000 00000000#5eb3652c 00000000 00000000 00000000 00000000kd> !dd 55ebe000 + f44 //获取物理地址#55ebef44 00000100 0012ff88 00401359 00000001#55ebef54 00430e40 00430d70 00000000 00000000#55ebef64 7ffd5000 00000000 00000000 0012ff5c#55ebef74 00000000 0012ffc4 004045f4 00422180#55ebef84 00000000 0012ff94 764e3c45 7ffd5000#55ebef94 0012ffd4 76e337f5 7ffd5000 76f4b12e#55ebefa4 00000000 00000000 7ffd5000 00000000#55ebefb4 00000000 00000000 0012ffa0 00000000

那么如何改写0地址呢?

kd> !dd 5650a000 //查询PDE#5650a000 5eb36867 53eb5867 00000000 00000000#5650a010 00000000 00000000 00000000 00000000#5650a020 00000000 00000000 00000000 00000000#5650a030 00000000 00000000 00000000 00000000#5650a040 00000000 00000000 00000000 00000000#5650a050 00000000 00000000 00000000 00000000#5650a060 00000000 00000000 00000000 00000000#5650a070 00000000 00000000 00000000 00000000kd> !dd 5eb36000 //查询PTE 发现为0#5eb36000 00000000 00000000 00000000 00000000#5eb36010 00000000 00000000 00000000 00000000#5eb36020 00000000 00000000 00000000 00000000#5eb36030 00000000 00000000 00000000 00000000#5eb36040 5694f867 00000000 00000000 00000000#5eb36050 00000000 00000000 00000000 00000000#5eb36060 00000000 00000000 00000000 00000000#5eb36070 00000000 00000000 00000000 00000000kd> !ed 5eb36000 55ebe867  //将PTE为0的地方写入X的PTE

看一下运行结果,成功写入到0地址

Windows内核之读取0地址

//全部代码int main(int argc, char* argv[]){

int *p = (int*)0x100; int *x = (int *)0; printf("%xn",&p); system("pause"); *x = 10; printf("%dn",*x); system("pause"); return 0;}



    此外,也可以通过shellcode存入0地址达到免杀的效果。

 

                        


 微信搜索关注 "安全族" 长期更新安全资料,扫一扫即可关注安全族!

Windows内核之读取0地址



本文始发于微信公众号(安全族):Windows内核之读取0地址

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年5月12日10:35:18
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Windows内核之读取0地址https://cn-sec.com/archives/372381.html

发表评论

匿名网友 填写信息