fastbin attack报错内存损坏
fastbin attack报错内存损坏
前言
在做off-by-one的Plaiddb的时候研究到最后一步,将one_gagedt写入__malloc_hook的时候包了内存损毁的错误,在星盟安全群里面,各位师傅给了我回答,觉得挺有用的,写下来做个笔记
报错
1 | [DEBUG] Received 0x19 bytes: |
这个错误说的是从bins中申请堆块的时候 这个堆块的大小和这条链上的大小不一致
就会报错
1 | if (__glibc_likely (victim != NULL)) |
如果victim的大小(fastbin这条链上的第一个堆块)不等于当前fastbin这条链上的大小
就会报memoey corruption的错误,这也就是为什么直接打fastbin attack__malloc_hook申请失败的原因
这里victim是可以被伪造的,这里虽然只对索引进行了判断,但索引也是通过大小得出来的,说到底比较的还是大小
解决办法
当我们直接用fastbin attack的时候会报错,因为do_check_remalloced_chunk函数会检查chunk的NON_MAIN_ARENA,IS_MAPPED,PREV_INUSE位。该函数中的if会判断是否为main_arena管理等
在fastbin中主要检查malloc的chunk的PREV_INUSE位是否为1。因为glibc规定这些chunk的PREV_INUSE位永远为1。
所以我们选取的攻击目标地址的偏移size成员数值的NON_MAIN_ARENA、IS_MAPPED、PREV_INUSE位都要为1,比如当前fastbin所能管理的freechunk大小为0x70~0x80,而伪造的size成员处的数值为0x71、0x72这样的数值不能够符合要求的,但0x7f这样的地址就可以满足需要,因此构造完①之后,攻击目标地址的伪造size成员成员数值的NON_MAIN_ARENA、IS_MAPPED、PREV_INUSE位都要为1,0x7f就可以满足。
于是我们需要在攻击目标地址一定偏移位的数值为0x7f
1 | do_check_remalloced_chunk (mstate av, mchunkptr p, INTERNAL_SIZE_T s) |
感谢董师傅给的讲解,非常详细。