首页
社区
课程
招聘
[求助]关于内核use after free
发表于: 2013-5-15 20:07 3440

[求助]关于内核use after free

2013-5-15 20:07
3440
近期阅读了mandt在blackhat 2011上发表的Kernel Attacks through User-Mode Callbacks。里面有些地方不明白,还请各位大牛指点。
在章节4.2 Use-After-free利用里,作者说通过调用SetWindowTextW或SetClassLongPtr设置Unicode string来申请到被释放的内存,而且可以控制内存内容,不知道原理到底是怎样的,我尝试着做了一下,结果并未成功。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 253
活跃值: (46)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
顶一个,球指点。
2013-5-16 11:23
0
雪    币: 599
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
没试验过,不过原理和ring3一样啊,释放的堆块根据大小被组织成用于快速分配的链表,你申请同样大小的堆块,很大几率得到的是漏洞部分代码释放掉的堆块,至于内核堆怎样去操纵才能提高几率变得稳定,可以再搜搜相关文章,貌似这个作者就写过吧。
2013-5-16 11:32
0
雪    币: 253
活跃值: (46)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
知道申请同样大小的堆块啊,ring3程序正常申请肯定是申请的用户态的堆,如何控制申请内核态的堆,同时还要控制内容。文章里说了用SetWindowText可以做,请利用过内核use after free的大牛出来指点一下。
2013-5-16 11:41
0
雪    币: 253
活跃值: (46)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
知道申请同样大小的堆块啊,ring3程序正常申请肯定是申请的用户态的堆,如何控制申请内核态的堆,同时还要控制内容。文章里说了用SetWindowText可以做,请利用过内核use after free的大牛出来指点一下。
2013-5-16 11:42
0
雪    币: 599
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
SetWindowText试验下呗,给个特殊点的字符串,调用完成全局搜索下,看看到底是什么情况。
2013-5-16 11:59
0
雪    币: 253
活跃值: (46)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
不能随便给个字符串。。。您先看看那篇文章吧。
2013-5-16 14:26
0
雪    币: 253
活跃值: (46)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
真心没人利用过么???
2013-5-22 20:49
0
雪    币: 253
活跃值: (46)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
我先简单说明一下我目前的分析过程。poc源自KK牛博客http://hi.baidu.com/4b5f5f4b/item/7c52d44323555b8e833ae13b友情提供,对于未解决的问题,还请各位大牛指点一下。
1、如何获得被释放的user object
    KK提供的poc可以稳定释放user object,对use-after-free漏洞进行利用首先要重新获得被释放的user object内存,并控制器内容。根据Tarjei Mandt在Hook of Death中提到的方法,调用SetWindowText,使用Unicode String作为该函数第二个参数(字符串不能包含double NULL),字符串长度为window object的长度(可通过dt win32k!tagWND查看,长度要包含double NULL),就可以申请到被释放的user object。字符串的内容就会填充user object。
2、如何控制字符串内容实现稳定exploit
    经过分析和调试发现,LinkWindow实现的伪代码如下:
                          pDestroyedObj->spwndNext->spwndPrev = pWindowObj;
                          pWindowObj->spwndNext = pDestroyedObj->spwndNext;
                          pWindowObj->spwndPrev = pDestroyedObj;
                          pDestroyedObj->spwndNext = pWindowObj;
    因为pDestroyedObj的内容可控,从而实现了任意地址可写,很自然想到可以通过控制pDestroyedObj->spwndNext的值最终往HalDispatchTable中写入1个用户态地址,然而pWindowObj是1个不可控的内核地址,因此该思路无法实现。于是考虑使用j00ru在http://j00ru.vexillium.org/?p=783中提到的覆盖MmUserProbeAddress地址,将其覆盖为1个高端内核地址,从而pass掉ProbeForWrite的检查。在利用过程中发现,HMAssignmentLock函数中将会检查被释放的HANDLEENTRY.Flag字段,如下所示。此时,就会读到非法地址,产生异常。因此,也没法解决。
                            mov eax, [esi]
                            mov ecx, gSharedInfo+4(aheList)
                            and eax, 0xffff
                            imul eax, gSharedInfo+8(HeEntrySize)
                            test[ecx+eax+9], 1
    接下来就是Mandt在文章中提到的方法,对HMUnlockObject中的dec dword ptr [eax+4]进行利用,eax可控。window object的HANDLEENTRY.bType为1,bType为0表示free。将window object的HANDLEENTRY.bType-1,那么在Destroy window的时候0地址就会被调用,从而实现了arbitrary code execution。我按照他的方法将HANDLEENTRY.bType成功设置为0,并在0地址申请内存,但是0地址处的代码并未被调用,请各位大牛指导一下,解决这个问题同时也解决了dec dword[arbitrary address]的利用问题。
2013-6-24 20:59
0
游客
登录 | 注册 方可回帖
返回
//