缓冲区溢出属于非常有名的漏洞之一,其大体含义为:缓冲区溢出是超出程序内存设定范围,数据溢出后程序发生异常,黑客可以利用缓冲区溢出执行指定代码,重写栈中的返回地址(ret_Addr)内容来执行任意操作。
本文从栈的介绍、shellcode代码示例、切入思路三个方面进行体系化介绍。
一、栈的介绍栈是一种内存使用方式,采用LIFO(Last In,First Out,先进后出),像手枪的子弹夹一样。
示例代码
当调用func函数时,在跳转至函数起始地址的瞬间,栈的形式如下图:
栈的存储形式
基地址为内存高位,从后向前(向地址递减方向)增长, $1、$2、$3为方法变量地址,ret_addr为main函数返回目标地址。
接下来 esp/rsp逐渐递减,为函数内部的局部变量分配内存空间,a&buff为方法内变量,存储形式如下图:
方法内变量存储
这时,如果数据溢出,超过了原本分配给buff数组的内存空间,数组后面的ebp、ret_addr以及传递给函数的参数都会被溢出的数据覆盖掉,如下图: