利用漏洞进行***可以大致分为漏洞挖掘、漏洞分析、漏洞利用三个步骤。这三部分所用的技术有相同之处,比如都需要精通系统底层知识、逆向工程等;同时也有一定的差异。
1. 漏洞挖掘
    安全性漏洞往往不会对软件本身功能造成很大影响,因此很难被QA工程师的功能性测试发现,对于进行“正常操作”的普通用户来说,更难体会到软件中的这类逻辑瑕疵了。
    由于安全性漏洞往往有极高的利用价值,例如,导致计算机被非法远程控制,数据库数据泄漏等,所以总是有无数技术精湛、精力旺盛的家伙在夜以继日地寻找软件中的这类逻辑瑕疵。他们精通二进制、汇编语言、操作系统底层的知识;他们往往也是杰出的程序员,因此能够敏感地捕捉到程序员所犯的细小的错误。
    寻找漏洞的人并非全是***者。大型的软件企业也会雇用一些安全专家来测试自己产品中的漏洞,这种测试工作被称作Penetration test(***测试),这些测试团队则被称作Tiger team或者Ethic hacker。
    从技术角度讲,漏洞挖掘实际上是一种高级的测试(QA)。学术界一直热衷于使用静态分析的方法寻找源代码中的漏洞;而在工程界,不管是安全专家还是***者,普遍采用的漏洞挖掘方法是fuzz,这实际是一种黑盒测试。
    我们会在第四篇的相关章节中进一步介绍漏洞挖掘与产品安全性测试方面的知识。
2. 漏洞分析
    当fuzz捕捉到软件中一个严重的异常时,当您想透过厂商公布的简单描述了解漏洞细节的时候,您就需要具备一定的漏洞分析能力。一般情况下,我们需要调试二进制级别的程序。
    在分析漏洞时,如果能够搜索到POC(proof of concept)代码,就能重现漏洞被触发的现场。这时可以使用调试器观察漏洞的细节,或者利用一些工具(如Paimei)更方便地找到漏洞的触发点。
    当无法获得POC时,就只有厂商提供的对漏洞的简单描述了。一个比较通用的办法是使用补丁比较器,首先比较patch前后可执行文件都有哪些地方被修改,之后可以利用反汇编工具(如IDA Pro)重点逆向分析这些地方。
    漏洞分析需要扎实的逆向基础和调试技术,除此以外还要精通各种场景下的漏洞利用方法。这种技术更多依靠的是经验,很难总结出通用的条款。本书将用3个实际的分析案例来帮助您体会漏洞分析的过程,希望能够起到抛砖引玉的效果。
3. 漏洞利用
    漏洞利用技术可以一直追溯到20世纪80年代的缓冲区溢出漏洞的利用。然而直到Aleph One于1996年在Phrack第49期上发表了著名的文章《Smashing The Stack For Fun And Profit》,这种技术才真正流行起来。
    随着时间的推移,经过无数安全专家和***们针锋相对的研究,这项技术已经在多种流行的操作系统和编译环境下得到了实践,并日趋完善。这包括内存漏洞(堆栈溢出)和Web应用漏洞(脚本注入)等。
    本书将从***两个角度着重介绍Windows平台下内存漏洞利用技术的方方面面。由于Web应用中的脚本注入***所使用的技术与缓冲区溢出相差较大,且自成体系,本书只做原理性简单介绍,如有机会将单独著书以述之。
 
本文节选自电子工业出版社2008年4月出版的 《0day安全:软件漏洞分析技术》一书。