缓冲区溢出攻击的分析与实时检测


作者:尚明磊,黄 皓


自从1988 年世界上首例利用缓冲区溢出漏洞进行扩散
的Morris 蠕虫病毒问世以来,缓冲区溢出攻击技术在互联网
上已经迅速传开,而且随着人们检测和防护技术的不断提高
也相应地变异出一些更隐蔽、更有针对性的缓冲区溢出攻击
类型。
缓冲区溢出的原因是因为C 语言并不检查缓冲区的边
界。当向一个有限空间的缓冲区中复制了过长的字符串时,
过长的字符串覆盖了相邻的存储单元,引起程序运行失败,
严重的可引起宕机、系统重新启动等后果。如果黑客利用缓
冲区溢出漏洞传入并运行精心编写的溢出字符串,就有可能
取得系统管理员的权限。接着黑客就可以在目标系统中建立
新建管理员账号、植入后门程序以及擦除活动日志,然后长
期控制它而不会被发现。缓冲区溢出是一种编程错误,但却
给网络带来极大的危害。因此能否在危害发生前迅速检测出
缓冲区溢出攻击,对于保护网络安全有着重要的意义。
1 缓冲区溢出的原理
计算机程序在内存中通常分为代码段、数据端和堆栈3
部分。代码段用于存放程序的机器码和只读数据。数据段用
于存放程序中的静态数据。动态数据则通过堆栈来存放。

当程序中进行函数调用时,计算机做如下操作:首先把
参数压入堆栈;然后保存指令寄存器(EIP)中的内容作为返回
地址(RET);第3 个放入堆栈的是栈基地址(EBP);再把当前
的栈指针(ESP)拷贝到EBP,作为新的栈基地址;最后为本
地变量留出一定空间,把ESP 减去适当的数值。下面以一个
具有典型缓冲区溢出漏洞的C 程序为例:
void function(char *str)
{ char buffer[80];
strcpy(buffer,str); }
void main()
{ int t;
char buffer[128];
for(I=0;I<127;I++)
buffer[I]=’A’;
buffer[127]=0;
function(buffer);
print(“This is a test/n”); }
程序是从内存低端向内存高端按顺序执行的,而堆栈的
增长方向与内存的增长方向相反,见表1。
表1 调用子程序function()时,堆栈情景
低地址 ------------------------------------------------------

你可能感兴趣的:(缓冲区溢出攻击的分析与实时检测)