1.缓冲区基础知识相关定义
缓冲区定义:缓冲区一块连续的内存区域,用于存放程序运行时,加载到内存的运行代码和数据。
缓冲区溢出:缓冲区溢出是指程序运行时,向固定大小的缓冲区写入超过其容量的数据。多余的数据会越过缓冲区的边界覆盖相邻内存空间,从而造成溢出。
缓冲区溢出攻击:缓冲区溢出攻击是指发生缓冲区溢出时,溢出的数据会覆盖相邻内存空间的返回地址、函数指针、堆管理结构等合法数据,从而使程序运行失败、或者发生转向去执行其他程序代码,从而使程序运行失败、或者执行预先注入到内存缓冲区中的代码。
补充:缓冲区溢出后执行的代码,会以原有程序的身份权限运行。
2.造成缓冲区溢出的根本原因
原因:因为缺乏类型安全功能的程序设计语言(C/C++等)处于效率的考虑,部分函数不对数组边界条件和函数指针引用进行边界检查。
如c语言中的函数:strcpy()、strcat()等。
建议:所以在日常开发软件过程中,程序员需要对边界检查,防止数据溢出。
3.缓冲区溢出的分类
(1)栈溢出漏洞
被调用的子函数中写入数据的长度,大于栈帧的基址(ebp)到esp之间预留的保存局部变量的空间时,就会发生栈溢出。
补充:写入数据的填充方向是从栈底向栈顶方向输入数据,多余的数据就会越过栈帧的基址,覆盖基址以上的地址空间。