unlink
利用损坏的块自由地获取任意写入。
利用free改写全局指针chunk0_ptr达到任意内存写的目的,即不安全取消链接。
0x01源代码
1 |
|
0x02代码分析
1 | 首先我们创建两个chunk 分别为chunk_0 和chunk_1 |
unlink
利用损坏的块自由地获取任意写入。
利用free改写全局指针chunk0_ptr达到任意内存写的目的,即不安全取消链接。
1 | #include <stdio.h> |
1 | 首先我们创建两个chunk 分别为chunk_0 和chunk_1 |
1 | 我们上一条 0x02 介绍了一个 fast double free 的绕过机制,通过在free 同一个 chunk中的中间插入对另外一个chunk 的free。 |
结合堆入坑指南看更好理解
1 | #include <stdio.h> |
1 | 编译后 gdb运行 |
1 | Allocated two fastbins: p1=0x220a010 p2=0x220a060 |
原文借鉴:https://www.anquanke.com/post/id/163971
1 | 首先先明确一下堆的概念,堆不同于栈,堆是动态分配的(由操作系统内核或者堆管理器),只有在程序中需要时才会分配。在 CTF 的 pwn 程序中,栈是程序加载进内存后就会出现,而堆是由 malloc、alloc、realloc 函数分配内存后才会出现。 |
1 | 1.pre size字段。只有在前面一个堆块是空闲的时候才有值,用来只是前一个堆块的大小。前面一个堆块在使用时他的值始终为0 |
1 | malloc(8) |
1 | 熟练掌握指针的使用在堆的题目分析中还是很有帮助的。下面简单说一下堆分配中的指针会用到了地方。 |
1 | 在 IDA 伪代码中的指针形式形如下面的情况: |
1 | 堆管理器 ptmalloc2 主要是通过 malloc/free 函数来分配和释放内存块。 |
1 | main_arena |
1 | bins 这个概念是与内存回收相关的,也就是堆管理器会根据用户已经申请到的内存空间大小进行释放,来决定放入哪类 bins 当作去。bins 直接翻译过来就是”垃圾桶”的意思,所以在系统在决定使用哪个 bins 时可以看作为”垃圾的分类”。 |
RHme3 CTF 的一道题
1 | RELRO STACK CANARY NX PIE |
1 | def alloc(name,attack = 1, |
1 | from pwn import * |
原文借鉴:http://d0m021ng.github.io/2017/02/24/PWN/Linux%E5%A0%86%E6%BC%8F%E6%B4%9E%E4%B9%8BDouble-free/
1 | Linux下堆分配器主要由两个结构管理堆内存,一种是堆块头部形成的隐式链表,另一种是管理空闲堆块的显式链表(Glibc中的bins数据结构)。关于bins的介绍已经有很多,就不赘述了。接下来介绍一下Linux下Double free漏洞原理以及free函数的堆块合并过程。 |
1 | free函数在释放堆块时,会通过隐式链表判断相邻前、后堆块是否为空闲堆块;如果堆块为空闲就会进行合并,然后利用Unlink机制将该空闲堆块从Unsorted bin中取下。如果用户精心构造的假堆块被Unlink,很容易导致一次固定地址写,然后转换为任意地址读写,从而控制程序的执行。 |
1 | 以64位应用为例:如果在free一个指针指向的块时,由于堆溢出,将后一个块的块头改成如下格式: |
1 | #include <stdio.h> |
1 | 程序通用malloc了三个chunk,紧接着通过fastbin double free的操作形成了如下freelist。 |
觉得还是整理一下比较好,可以联系how2heap里的文章帮助理解,最好结合题目来做会比较简单,后面的文章我会做几题
原文:https://blog.csdn.net/qq_31481187/article/details/73612451
1 |
|
1 | 还是一段简单的程序 |
1 | unsigned __int64 sub_CBB() |
1 | 1.double free使得heap可控 |
1 | 还不是很懂 |
1 | #include stdio.h |
1 | This file demonstrates a simple double-free attack with fastbins. |
1 | fastbins 可以看成一个 LIFO 的栈,使用单链表实现,通过 fastbin->fd 来遍历 fastbins。由于 free 的过程会对 free list 做检查,我们不能连续两次 free 同一个 chunk,所以这里在两次 free 之间,增加了一次对其他 chunk 的 free 过程,从而绕过检查顺利执行。然后再 malloc 三次,就在同一个地址 malloc 了两次,也就有了两个指向同一块内存区域的指针。 |
堆的系统学习
1 | #include <stdio.h> |
1 | This file doesn't demonstrate an attack, but shows the nature of glibc's allocator. |
1 | 当一个较大的 chunk 被分割成两半后,如果剩下的部分大于 MINSIZE,就会被放到 unsorted bin 中。 |