缓冲区溢出简单的来讲分为两种
- 栈溢出
- 堆溢出
那么什么是栈什么是堆呢
在这里简单谈一下对于堆和栈的理解 :
<p>栈: 用来为程序中已经声明的变量来分配内存空间的地址,以及保存函数返回地址的空间,可以用来实现函数的递归调用。
例如 int ,char 这类的定义的数据。
<p>堆: 在程序运行时动态分配的内存。一般使用一个堆指针来使用得到的内存。堆在使用时需要实用专有的函数进行声明。如C语言的malloc以及C++的new。注意使用完后要回收内存,否则会造成内存泄露。
例如 int *name;
name = (int *)malloc(8);
栈溢出
修改临接变量(变量越界缺陷)
修改函数返回地址"自主控制":
定位工具:ollydbg.exe
相对地址选择:kernel32.dll user32.dllS·E·H结构函数: 将异常处理函数入口地址更改为shellcode的地址。
堆溢出
堆的结构(堆区)
- 堆块 :
- 块首:8byte,用来存储堆块的信息
- 块身: 用来存放数据(堆块的指针是直接指向快身的)
- 堆表 :堆区的起始。 空闲堆块的索引。
最重要的堆表有两种:
空表(双向链表)128项。
块表(一般在缓冲区溢出中不予利用)
堆溢出的利用
- Dword Shoot:利用堆管理时“卸下”操作。
- Heap Spray:申请大量内存。slide code → shell code。