pwn无法入门6-heap

Author Avatar
Aryb1n 6月 09, 2017

转接堆溢出

继续学习

fastbin & UAF

首先注意fast chunk的标志位p总是1的,所以没办法辨别某一块到底是不是在用,只能通过fd

http://www.freebuf.com/news/88660.html 这一片里面提到

当然,在实际执行分配或回收时,还会对目标chunk的大小进行检查。但如果能够修改fd内容,那么在随后的malloc时便可能将修改后的地址返回,这进一步往往能够造成向任意地址写任意内容(write-anything-anywhere)的后果。
操作在于溢出,写到fd的内容,而漏洞发生在于,由于fd被改写,所以在malloc的时候可能会返回任意你想要的地址

p = malloc(32);
//这个p由于你前面改写`fd`,这个返回奇怪的地址,之后你对这个地址写就

这个文章前面其实说的很清楚,malloc两个chunk,后来的最为fastbin表里的index,当第二个chunk释放的时候,第二块chunk里的fd所指向的地方(正常情况下是第一块chunk的地址)会作为该fastbin的首块chunk的地址,如果我们能以某种方式改掉这个后来的这个块的fd到任意地址(通过堆溢出)那么我们在两次malloc,两次free(这前四次操作都是正常操作),再两次malloc,再进行最后一次malloc(第五次)就能获得任意地址,然后实现任意地址写,不知道理解对不对

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>

int size = 40 | 0x1;

int main(int argc, char *argv[]) {
    void *buf0, *buf1, *buf2;
    buf0 = malloc(32);
    buf1 = malloc(32);

    free(buf1);     //注意这里先释放了buf1
    free(buf0);     //这个时候两块chunk已经放到了fastbin里
    buf0 = malloc(32);      //取走一块

    read(0, buf0, 64); // 利用取走的这块的写操作,这个地方改写到buf1的fd
    buf1 = malloc(32);

    buf2 = malloc(32);
    printf("buf2 is at %p\n", buf2);

    return 0;
}

参考

https://sploitfun.wordpress.com/2015/02/10/understanding-glibc-malloc/comment-page-1/ (英文的,但好多人都推荐)
http://blog.csdn.net/maokelong95/article/details/51989081 (上面那一篇的翻译版)
https://github.com/shellphish/how2heap (这个是好像很不错的样子,已经star)