现在越来越多的人爱上了漏洞发掘,在越来越多的教程、傻瓜工具面前,有时候我们却忽略了最基本的概念,比如bug和漏洞,当我们fuzzing一个程序时,一旦发现了Windows弹出异常提示,就可能以为发现了缓冲区溢出漏洞,一个异常提示到底是真正的漏洞还是鸡肋的bug需要一点点小技巧。
一、设置调试器
方法很简单就是设置异常实时调试器,如果安装了vc++,默认会调用该集成开发环境中的调试器,当然也许你对vc++并不“来电”,这时候可以使用逆向利器——OllyDbg(以下简称OD),首先运行OD,依次选择“选项”——“实时调试器设置”——“设置Ollydbg为实时调试器”。
设置完成后,来看两个小例子看一下漏洞与bug的区别。
二、漏洞程序示例
下面是一个比较典型的主子函数的缓冲区溢出示例。
直接运行一起打包的overflow.exe,就会自动调试实时调试器Od(有的机器会有一个异常提示,需要按取消招钮才可以启动实时调试器,在虚拟中的效果一般不明显)。
此时观察寄存器界面与栈区,很容易发现当前EIP指向的是aaaa的地址,即EIP的内容为缓冲区中的数据。因此可以很容易的判断这是一个典型的漏洞。
三、bug示例
bug出现的原因有很多,在实际操作中碰到的最多是异常,异常指的是CPU执行指令时产生的问题,Windows中有N多的异常比如单步执行异常、内存访问异常、内存未对齐异常(IA64中)等等。bug示例代码只有一句——*(iIlt *)0=0;向内存地址0x0000 0000写入数据0,这会产生一个内存访问异常。
运行一起打包的bug.exe,在OD中的状态。
OD最下方的状态栏,会提示“正在写入到[0000 0000],使用shfit+f7/f8/f9来忽略程序异常。寄存器窗口中的EIP指向为下一条指令的地址。对比以下上面两个程序在OD中的状态,就很容易理解怎么区分bug和漏洞了。
缓冲区溢出漏洞一般是当前EIP指向栈区或堆区中保存的fuzzing的数据内容,而bug往往是局限于指令执行期间的一些异常。
本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,作者不鼓励或支持任何形式的非法破解行为。