heap

为什么提到堆:

  • stack exploit类型的题目在很多CTF中都出现过
    • writeup简单学习下就能够理解
    • 网络上也有很多相关资料
  • 很少有CTF队伍主攻heap
    • 主攻pwn的队伍都很少
  • 通常这类问题分值较高
    • 这是必须加强的部分

什么是堆

使用heap的程序例子1

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h> 
#include <string.h>
#include <stdlib.h>
int main(int argc, char* argv[]){
char* ptr;
ptr = (char*)malloc(20);
strcpy(ptr, argv[1]);
printf("%s\n", ptr);
free(ptr);
return 0;
}
  • 分配20字节内存
  • 字符串拷贝
  • 显示拷贝内容
  • 释放

实际运行大概像这样:

1
2
3
$ gcc heap1.c
$ ./a.out miaomiao
miaomiao

使用heap的程序例子2

1
2
3
4
5
6
7
8
9
#include <iostream> 
int main(void){
int *p;
p = new int();
std::cin >> *p;
std::cout << *p << std::endl;
delete p;
return 0;
}
  • 分配int变量内存
  • 读取值
  • 显示值
  • 释放

实际运行大概像这样:

1
2
3
4
$ g++ heap2.cpp
$ ./a.out
6
6

malloc和new是从哪里获取内存的?答案是heap

从以下区域分配内存

  • 不使用时使用free()进行释放
  • 如果malloc次数过多,heap自身会因为不足而扩张(sbrk)
  • 太大的内存请求将通过另一种方式分配(mmap)
  • sbrk/mmap在malloc内部自动进行
  • 编写程序时并不需要非常在意heap机制

    • 只需要用了malloc() 后记得最终free()即可
  • 使用错误会产生漏洞

  • 需要了解细节的是

    • malloc/free是glibc提供的,直接去看源码是最好的学习方法