UnsortedbinAttack.c 源码
调试分析
1.首先定义了一个变量,存放在栈上
2.然后malloc一个0x400大小的chunk p
3.为了防止在下一次执行free的时候 chunk p 被consolidate合并到 top chunk 中,这里再申请一个0x500大小的chunk。
4.然后将chunk p free掉,
注意这里,
chunk p被放到了unsortedbin中,且fd和bk指针都指向main_arena+88
然后我们改写chunk p的bk指针。
需要将chunk p的bk指针改写为栈上变量的低2个”单位”(8字节)的地址,
这是因为在调用malloc整理unsortedbin的时候遵循“LILO”(Last In Last Out)的原则,会将av分配区的unsortedbin的bk指向的最后一个chunk作为victim,victim的bk指向的chunk作为bck,会从unsortedbin链表尾部开始处理,对chunk做完处理就将chunk移出链表,也就是源码中红框中的代码
这也是unsortedbin attack的来源,
因为在这里并未对bck做足够的检查就将bck的fd指针指向main_arena数组,将会造成main_arena地址的泄露,而main_arena是在libc上的,就会进而导致libc地址的泄露等一系列问题。
查看bins,
unsortedbin的bk指针指向刚刚free掉的 chunk p ,p的bk指针指向栈上的假的chunk头。
5.进行malloc
查看bins
可以看到 chunk p 被移出unsortedbin,现在unsortedbin的bk指针指向了栈地址,并且通过源码可知这个栈地址指向的地方被当做bck的时候会将 bck->fd 指向bins上的unsortedbin,也即这里的 main_arena+88,也就是将 main_arena+88 写到stack_var了 。
以上就是unsortedbin attack的全部内容。
来源:freebuf.com 2021-07-21 20:12:23 by: 17608406504
请登录后发表评论
注册