根据缓冲区溢出攻击的步骤,可将常用的缓冲区溢出攻击检测技术分为以下3种类型:基于输入字符串的检测方法,基于保护堆栈中的返回地址的检测方法和基于监视系统调用的检测方法。
工具/原料
电脑
c/java开发工具
方法/步骤
1、基于输入字符串的检测方法对输入的字符串进行检测,确定其为溢出攻击字符串时采取阻拦措施,使攻击者无法注入攻击代码。一般有以下3种方法构建溢出攻击字符串。如图所示:第1种溢出攻击字符串适用于缓冲区大于ShellCode长度的情况;第2种溢出攻击字符串一般用于缓冲区小于ShellCode长度的情况;第3种方法是将ShellCode放在环境变量里,是目前较为常用的方法。
2、基于保护堆栈中返回地址擢爻充种的检测方法缓冲区溢出攻击最关键的步骤是要通过修改函数返回地址来改变程序的流程,因此,寄噢剪飕在函数调用返回前,通过检查返回地址是否被修改可以判断是否有缓冲区溢出攻击发生。该检测的实现可以通过在源码中插入一些约束和判断的模块,然后在编译后的程序运行期间对有关变量和堆栈区域进行监控,检测是否有攻击发生。StackGuard和StackShield就是这一类型的工具,它们都是gcc编译器的扩展工具,用于监控调用的函数返回地址是否正常。
3、基于监视系统调用的检测傲艟茏慕方法如果攻击者成功注入攻击代码,并改变了程序的执行流程使指令的执行指针指向了ShellCode的入口地址。按照一次缓冲区攻击鹚兢尖睁的3个步骤,还须执行ShellCode来完成攻击目的。因此,通过检测是否有ShellCode运行可以检测是否发生缓冲区溢出攻击。攻击者既希望ShellCode利用获得的权限启动一个交互式的shell进程来完成尽量多的事情,又希望ShellCode尽量短小从而更加隐蔽,所以绝大多数ShellCode都会调用系统函数。由于监视所有系统调用会耗费大量系统资源,因此只对ShellCode常用的系统调用进行监视,根据某些特征判断受监视的系统调用是否为非法调用就可确定被保护系统是否遭到缓冲区溢出攻击。例如,如果发现系统调用的返回地址为堆栈,则可认为其为非法调用,因为很少有程序在堆栈上运行代码。