heap
为什么提到堆:
- stack exploit类型的题目在很多CTF中都出现过
- writeup简单学习下就能够理解
- 网络上也有很多相关资料
- 很少有CTF队伍主攻heap
- 主攻pwn的队伍都很少
- 通常这类问题分值较高
- 这是必须加强的部分
什么是堆
- 调用
malloc()
或者new()
时使用的是heap区域 - heap区域中,”使用中”和”已free”的内存状态大不相同
- 详情可以通过小崎老师发布的malloc视频来了解
- 视频大概两个小时,强烈建议看一次
使用heap的程序例子1
1 | #include <stdio.h> |
- 分配20字节内存
- 字符串拷贝
- 显示拷贝内容
- 释放
实际运行大概像这样:
1 | $ gcc heap1.c |
使用heap的程序例子2
1 | #include <iostream> |
- 分配int变量内存
- 读取值
- 显示值
- 释放
实际运行大概像这样:
1 | $ g++ heap2.cpp |
malloc和new是从哪里获取内存的?答案是heap
从以下区域分配内存
- 不使用时使用free()进行释放
- 如果malloc次数过多,heap自身会因为不足而扩张(sbrk)
- 太大的内存请求将通过另一种方式分配(mmap)
- sbrk/mmap在malloc内部自动进行
编写程序时并不需要非常在意heap机制
- 只需要用了malloc() 后记得最终free()即可
使用错误会产生漏洞
需要了解细节的是
- malloc/free是glibc提供的,直接去看源码是最好的学习方法