危险漫步博客
新鲜的“黑客思维”就是从全新的角度看待黑客技术,从更高的层面去思考;专注于黑客精神及技术交流分享的独立博客。
文章2307 浏览21468240

区别bug与漏洞

现在越来越多的人爱上了漏洞发掘,在越来越多的教程、傻瓜工具面前,有时候我们却忽略了最基本的概念,比如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往往是局限于指令执行期间的一些异常。

相关推荐