what
在计算机安全领域,缓冲区溢出是个古老而经典的话题。
众所周知,计算机程序的运行依赖于函数调用栈。
栈溢出是指在栈内写入超出长度限制的数据,从而破坏程序运行甚至获得系统控制权的攻击手段。
本文将以32位x86架构下的程序为例讲解栈溢出的技术详情。
为了实现栈溢出,要满足两个条件。
第一,程序要有向栈内写入数据的行为;
第二,程序并不限制写入数据的长度。
历史上第一例被广泛注意的 “莫里斯蠕虫” 病毒就是利用C语言标准库的 gets() 函数
并未限制输入数据长度的漏洞,从而实现了栈溢出。
函数调用栈是指程序运行时内存一段连续的区域,用来保存函数运行时的状态信息,包括函数参数与局部变量等。称之为“栈”是因为发生函数调用时,调用函数(caller)的状态被保存在栈内,被调用函数(callee)的状态被压入调用栈的栈顶;在函数调用结束时,栈顶的函数(callee)状态被弹出,栈顶恢复到调用函数(caller)的状态。函数调用栈在内存中从高地址向低地址生长,所以栈顶对应的内存地址在压栈时变小,退栈时变大。