能力值:
( LV2,RANK:10 )
|
-
-
2 楼
呼唤大神
|
能力值:
( LV6,RANK:90 )
|
-
-
3 楼
感觉不太对,悬垂指针一般都是UAF,或者double free的漏洞利用吧,首先悬垂指针一般是在堆里吧,没法获得指令地址,更算不出当前用户dll或者系统dll的基址,其次dangling pointer释放前指向的一般都是object或者vftable,怎么会指向系统dll或者用户dll的指令空间呢,再者dangling pointer是在当前对象释放后,主要是对引用计数的控制不严格,就算引用到了,释放后的dangling pointer一般都是一个无意义的地址值,这个和MemGC机制有关,如果单纯的free可能就直接是????????了,最后就算悬垂指针指向了一个指令空间的地址,也需要获得悬垂指针的地址,这个地址也不好获得,因为悬垂指针处于堆中,每次堆的申请是用户不可控的,每次堆申请的值也不好获得,还得用另一个漏洞。 一般dangling pointer的用法就是用dword shoot来覆盖这个dangling pointer,打个比方在浏览器中,可能通过new Array[]来申请和原释放对象相同大小的数组来覆盖到这个dangling pointer,这样再次引用的时候就能够通过dangling pointer获得一定的控制能力,如果目标是个长度结构之类的话就能获得内存空间的读写能力,进而绕过DEP和ASLR
|
能力值:
( LV6,RANK:90 )
|
-
-
5 楼
自由的翅膀 dangling pointer本身应该是在栈上吧,虽然其指向的内容位于堆。另外,但是在一些地方我是看到过有人说dangling pointer是用来绕过DEP和ASLR的好办法,例如在stack e ...
只能说有可能在栈上,绝大多数我们遇到悬垂指针的情况,都是在一个对象的结构体中,比如定义一个struct结构体,那么对这个结构体进行内存开辟的时候,这个结构体指针的变量确实在栈上,但是里面成员变量都会结构体指针malloc的堆中,而悬垂指针往往是struct中的成员变量。 你所说的在栈上,或者你看的文章,可能是单独定义的某个单独指针,这种情况很少了,就像之前我在论坛里和一个朋友讨论的ret2ret,这种情况也极少见,ret2ret这种方法确实是可以bypass ASLR,但是因为大家都知道对这种单一指针申请和释放的安全控制,所以情况比较少。 假如按你所说,有一个这样的悬垂指针,首先悬垂指针对应的栈的地址的确不好获得,以我所知获得栈地址比较好的方法就是爆破,但前提是得是有fork这样比较好的条件,其次悬垂指针是释放后产生的,释放后指向的堆空间是个无意义的位置,如我之前所说,你也不好获得dll的地址。其次stack pivot确实有可能使用,只要有寄存器指向这个dangling pointer,满足xchg,或者可以将dangling pointer的寄存器push进栈,然后再pop esp调整栈帧等等。 不知楼主在哪看的文章,可否分享一下。
|
|
|