缓冲区溢出(Buffer Overflow)
主题:缓冲区溢出(Buffer Overflow)
缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上(可以联想单片机
对栈的操作)。理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所
分配的储存空间相匹配,这就为缓冲区溢出埋下隐患。
通过向程序的缓冲区写入超出其长度的内容,导致缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它
指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。
缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件中广泛存在。利用缓冲区溢出攻击,可以导致程序
运行失败、系统宕机、重新启动等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法
操作。课程的练习基本没什么实际意义。后面会补充一些缓冲区溢出的例子,以备深入学习该主题。
缓冲区溢出攻击原理
大多数的缓冲溢出攻击都是通过改变程序运行的流程到入侵者植入的恶意代码,其主要目的是为了获取超级用户的shell。原理
相当简单:将恶意指令存放在buffer中,这段指令可以得到进程的控制权,从而达到攻击的目的。
缓冲区溢出的技术:栈溢出(stack overflow)、堆溢出(heap overflow)。
1.堆和栈
当一个程序开始运行时,一些基本信息(指令、变量等)会事先装入内存,一个进程维护着它自己的一段内存空间,称为进程空间
(上下文),它维护着进程所需要的代码段、堆栈段和数据段,如图1。
图1 进程空间组织图
在进程空间的高地址区域存放着进程相关的