堆溢出
1.介绍
堆溢出指的是程序向某个堆块中写入的字节数超过了堆块本身可使用的字节数(堆块本身可使用的字节数>用户申请的字节数),因此导致了溢出,并覆盖到物理相邻的高地址的下一个堆块。
原理和栈溢出基本一样,不过堆溢出很难像栈溢出一样直接控制程序指向流程。一般堆溢出的策略为:
-
覆盖与其物理相邻的下一个chunk内容。
- prev_size
- size
- NON_MAIN_ARENA
- IS_MAPPED
- PREV_INUSE
- the True chunk size
- chunk content,从而改变程序固有的执行流。
-
利用堆的机制(如unlink)来实现任意地址写入或者控制堆块中的内容等效果,从而控制程序的执行流
2.示例
给出一个示例代码:
#include <stdio.h>
int main(void) {
char* chunk;
chunk = malloc(24);
puts("Get input:")