pwn无法入门6-heap
转接堆溢出
继续学习
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)