首页
社区
课程
招聘
见到有的地方说绕过DEP/ASLR一个很好的方法是用dangling pointer,然后有点疑问
发表于: 2017-2-21 21:29 3936

见到有的地方说绕过DEP/ASLR一个很好的方法是用dangling pointer,然后有点疑问

2017-2-21 21:29
3936

      我说说我对用dangling pointer绕过ASLR的理解吧,就是有一个被指放了所指向内存的引用,例如它是在一个用户自定义的模块user.dll中,以它作为基址,在ASLR下也能获取到user.dll的的指令地址,如果其中调用了ntdll的函数,那么更是可以先获取到调用函数这条指令的地址,然后再根据其中的内容定位到ntdll中这个函数的地址,进而连ntdll所有指令都可以通过偏移算出,然后还有类似的情况就还可以再获得其他模块的指令的地址,我的理解请问有没有错呢?如果有,请指出。另外还有一个问题,这个作为基址的dangling pointer的地址(如果存在的话),要怎么获得呢?


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 30
活跃值: (216)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
呼唤大神
2017-2-22 16:50
0
雪    币: 292
活跃值: (815)
能力值: ( 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
2017-2-23 09:31
0
雪    币: 292
活跃值: (815)
能力值: ( 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调整栈帧等等。
不知楼主在哪看的文章,可否分享一下。

2017-2-23 11:00
0
游客
登录 | 注册 方可回帖
返回
//