原文借鉴:https://www.anquanke.com/post/id/163971
0x01什么是堆
1 | 首先先明确一下堆的概念,堆不同于栈,堆是动态分配的(由操作系统内核或者堆管理器),只有在程序中需要时才会分配。在 CTF 的 pwn 程序中,栈是程序加载进内存后就会出现,而堆是由 malloc、alloc、realloc 函数分配内存后才会出现。 |
0x02堆的基本结构
1 | 1.pre size字段。只有在前面一个堆块是空闲的时候才有值,用来只是前一个堆块的大小。前面一个堆块在使用时他的值始终为0 |
0x0364位程序例子
1 | malloc(8) |
0x04指针和地址
1 | 熟练掌握指针的使用在堆的题目分析中还是很有帮助的。下面简单说一下堆分配中的指针会用到了地方。 |
0x05IDA中常见的指针表示形式
1 | 在 IDA 伪代码中的指针形式形如下面的情况: |
0x06 申请堆块的本质
1 | 堆管理器 ptmalloc2 主要是通过 malloc/free 函数来分配和释放内存块。 |
0x07 main_arena与top chunk
1 | main_arena |
0x08 free函数和bins
1 | bins 这个概念是与内存回收相关的,也就是堆管理器会根据用户已经申请到的内存空间大小进行释放,来决定放入哪类 bins 当作去。bins 直接翻译过来就是”垃圾桶”的意思,所以在系统在决定使用哪个 bins 时可以看作为”垃圾的分类”。 |