在三环应用层开发中,虚拟地址的0地址是无法访问的,而今天通过在内核层零环进行操作0地址。
1.实现过程
在C语言中,简单看下方的例子:可能很多实际开发都会用到这样的判断。而NULL就是地址0的地方。
char * buffer = (char*)0;
if(buffer==NULL){
cout << "为NULL"<<endl;
}
那么如何来进行操作0地址的地方呢?可以看下方的图,PTE对应的就是物理页。
例如定义一个变量X,将变量X的PTE赋给0地址的PET即可。
2.
首先获取变量X的地址
之后进行获取程序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 00000000
!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 00000000
!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地址呢?
!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 00000000
!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 00000000
!ed 5eb36000 55ebe867 //将PTE为0的地方写入X的PTE
看一下运行结果,成功写入到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地址
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论