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

[求助]关于内核use after free

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

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 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牛博客4aeK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3S2A6i4K6u0W2j5X3q4A6k6s2g2Q4x3X3g2U0L8$3#2Q4x3V1j5@1j5U0g2X3y4h3j5@1j5W2)9J5c8X3W2@1k6h3#2Q4x3V1j5%4j5K6f1J5k6o6b7@1x3K6t1K6y4e0f1#2j5U0S2W2z5o6x3K6j5h3f1I4x3$3u0Q4c8e0g2Q4z5p5k6Q4z5p5u0Q4c8e0k6Q4z5o6y4Q4z5o6g2Q4c8e0k6Q4z5p5k6Q4z5e0m8Q4c8e0c8Q4b7V1g2Q4z5f1u0Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0g2Q4b7f1k6Q4b7U0W2Q4c8e0c8Q4b7V1q4Q4z5p5g2Q4c8e0k6Q4z5f1y4Q4b7f1q4Q4c8e0S2Q4b7e0N6Q4b7e0y4Q4c8e0g2Q4z5o6k6Q4b7U0y4Q4c8e0N6Q4z5f1q4Q4z5o6c8Q4c8e0W2Q4z5e0N6Q4b7f1g2Q4c8e0W2Q4b7e0u0Q4z5e0S2Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0S2Q4b7V1k6Q4z5e0S2Q4c8e0S2Q4b7f1k6Q4b7U0N6Q4c8e0g2Q4z5e0m8Q4z5o6c8Q4c8e0c8Q4b7V1c8Q4z5p5c8Q4c8e0g2Q4b7e0c8Q4b7e0N6Q4c8e0N6Q4z5o6W2Q4z5f1u0Q4c8e0k6Q4z5p5y4Q4z5o6N6Q4c8e0N6Q4z5o6u0Q4b7U0W2Q4c8e0c8Q4b7U0S2Q4z5o6m8Q4c8e0c8Q4b7U0S2Q4z5p5u0Q4c8e0y4Q4z5o6m8Q4z5o6t1`.
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在a34K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3Z5H3x3s2u0#2i4K6u0W2N6X3g2^5K9h3I4D9K9i4g2E0i4K6u0W2L8%4u0Y4i4K6u0r3i4K6y4r3M7q4)9K6c8o6M7^5x3#2!0q4y4q4!0n7z5q4!0m8c8q4!0q4y4W2)9^5c8W2)9&6x3q4!0q4y4g2)9^5z5q4!0n7x3q4!0q4y4#2)9&6b7g2)9^5y4q4!0q4z5q4!0m8y4W2)9^5y4W2!0q4y4#2)9&6b7W2)9&6y4V1#2E0g2i4y4W2M7W2m8J5L8$3u0W2b7h3c8V1M7X3g2K6M7#2!0q4y4g2)9&6b7#2!0n7x3q4!0q4y4g2)9&6c8q4)9^5x3q4!0q4c8W2!0n7b7#2)9^5b7#2!0q4y4g2!0n7x3q4)9^5y4W2!0q4y4g2)9^5y4g2!0n7y4W2!0q4z5q4!0m8y4W2)9^5y4W2!0q4y4#2)9&6b7W2)9&6y4W2!0q4y4q4!0n7z5q4!0n7b7e0q4Q4c8e0c8Q4b7U0S2Q4b7f1q4Q4c8e0W2Q4b7f1u0Q4z5e0S2Q4c8e0N6Q4b7f1u0Q4b7f1k6Q4c8e0g2Q4z5o6k6Q4z5o6g2Q4c8e0k6Q4b7e0m8Q4b7U0S2Q4c8e0g2Q4z5f1y4Q4b7U0m8Q4c8e0g2Q4z5f1c8Q4z5o6m8Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0c8Q4b7V1u0Q4z5p5g2Q4c8e0S2Q4z5o6m8Q4z5p5y4H3j5i4y4K6i4@1f1$3i4K6S2q4i4K6R3&6f1s2u0G2j5X3g2r3L8%4u0i4M7X3W2@1k6g2!0q4y4#2)9&6b7g2)9^5y4q4!0q4y4W2!0m8x3#2)9^5x3q4!0q4y4W2)9&6c8W2!0m8y4g2!0q4x3#2)9^5x3q4)9^5x3W2!0q4y4g2)9&6b7#2!0m8z5q4!0q4y4g2)9^5z5q4!0m8z5g2!0q4y4#2)9&6y4q4!0m8z5q4!0q4z5q4!0n7c8W2)9^5y4#2!0q4y4#2!0m8z5q4)9^5b7W2!0q4y4q4!0n7z5q4!0m8c8q4!0q4y4g2)9^5c8W2)9&6x3g2!0q4y4#2)9^5c8g2!0n7x3q4!0q4c8W2!0n7b7#2)9^5b7@1S2y4b7i4y4K6K9h3N6F1L8h3g2F1N6p5I4G2j5$3E0Q4c8e0g2Q4z5o6N6Q4b7V1c8Q4c8e0k6Q4z5e0g2Q4b7U0m8Q4c8e0c8Q4b7U0S2Q4b7f1c8Q4c8e0g2Q4b7U0m8Q4z5o6k6Q4c8e0c8Q4b7V1y4Q4z5f1q4Q4c8e0k6Q4b7e0y4Q4z5o6m8Q4c8e0k6Q4z5f1k6Q4b7e0g2Q4c8e0S2Q4b7e0u0Q4b7f1u0Q4c8e0W2Q4z5o6N6Q4z5p5q4Q4c8e0k6Q4z5e0c8Q4b7V1g2Q4c8e0N6Q4z5f1q4Q4z5o6c8t1b7f1&6p5e0p5g2q4e0W2c8d9h3g2)9J5k6f1k6D9j5h3N6Q4c8e0g2Q4b7f1c8Q4z5e0N6Q4c8e0k6Q4b7f1g2Q4b7U0g2Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0g2Q4b7e0k6Q4z5o6u0Q4c8e0c8Q4b7U0S2Q4z5p5u0Q4c8e0k6Q4z5o6W2Q4z5o6m8Q4c8e0N6Q4b7e0c8Q4b7V1q4Q4c8e0y4Q4z5o6m8Q4z5o6u0Q4c8e0k6Q4b7f1c8Q4b7e0c8Q4c8e0k6Q4z5e0N6Q4b7U0k6Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0g2Q4b7U0m8Q4b7U0q4Q4c8e0c8Q4b7V1y4Q4z5f1q4Q4c8e0S2Q4b7f1k6Q4b7V1u0Q4c8e0g2Q4z5o6S2Q4b7U0m8Q4c8e0W2Q4z5f1c8Q4z5f1g2Q4c8e0k6Q4b7U0y4Q4z5e0g2Q4c8e0g2Q4z5f1y4Q4b7U0m8Q4c8e0g2Q4z5f1c8Q4z5o6m8Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0c8Q4b7V1q4Q4b7e0N6Q4c8e0N6Q4z5e0c8Q4z5f1k6Q4c8e0g2Q4b7V1y4Q4z5o6u0Q4c8e0g2Q4b7U0S2Q4b7U0S2Q4c8e0y4Q4z5o6m8Q4z5o6u0Q4c8e0g2Q4z5f1u0Q4b7e0m8Q4c8e0k6Q4b7f1c8Q4b7e0c8Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0c8Q4b7U0W2Q4z5f1k6Q4c8e0k6Q4b7U0u0Q4b7e0q4Q4c8e0k6Q4b7U0y4Q4z5e0g2Q4c8e0S2Q4b7e0N6Q4b7e0y4Q4c8e0g2Q4z5o6k6Q4b7U0y4Q4c8e0y4Q4z5o6m8Q4z5o6t1`.
                            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
游客
登录 | 注册 方可回帖
返回