## 2.1、源代码审计
这个部分是关于熟悉应用程序编译为本地代码时显现的漏洞。对一门编译语言编写应用程序时的精准和完整理解,在没有学习编译器怎样转换源代码为机器语言和处理器怎么执行代码前是无法达到的。一种简单的获得这些转换经验的方式是通过逆向工程你自己的代码或源码可见的项目。在这个部分结束时你将会识别用诸如C和C++编译语言编写的常见漏洞。
大型软件包由于使用第三方软件库导致漏洞普遍存在。常见的例子包括像libxml、libpng、libpoppler和用来解析已编译文件格式和协议的libfreetype等这样的库。这些库中的每一个都曾在历史上被发现过易于攻击的漏洞。即便当新的版本发布之后,也无助于绝大多数软件的未更新,在这些情况下很容易发现易于发现的已知漏洞。
**课程**
* [Source Code Auditing I](http://vimeo.com/30001189)
* [Source Code Auditing II](http://vimeo.com/29702192)
**挑战工坊**
为了锻炼你的技能,我们建议通过一个故意留有漏洞的程序过一遍尽可能多漏洞发掘之旅,然后转移到实际应用中做同样的事情。
Newspaper应用是一个用C语言编写的小型服务应用,允许认证的用户读取和写入文章到一个远程文件系统。Newspaper编写的方式使得它对于许多不同的攻击都有漏洞可以利用。你应该能够通过源码发现其中至少10个bug或可能存在的漏洞。
* [Newspaper App](https://trailofbits.github.io/ctf/vulnerabilities/source_workshop/news_server.c)
* [Newspaper App Installer](https://trailofbits.github.io/ctf/vulnerabilities/source_workshop/news_install.sh)
Wireshark,无论怎样,是一款从1998年开始持续开发的行业标准级别的网络协议分析器。相比漏洞诸多的Newspaper应用,Wireshark的漏洞少之又少。查看[wireshark安全页面](http://wireshark.org/security),找到一个协议解析器的名字并测试是否你可以在没有查看漏洞细节的情况下发现漏洞。解析器位于/epan/dissectors/目录。
* [Wiireesakk 1.8.5](http://www.wireshark.org/download/src/all-versions/wireshark-1.8.5.tar.bz2)
**工具**
当进行源码审计时,使用一款用户分析和引导代码库的工具是很有帮助的。下面是两款工具,Source Navigator和Understand,通过收集和展现相关数据关系、API使用、设计模式和控制流的信息来帮助分析员快速熟悉代码。一个有用的对比工具的例子同样列在下方。其中一个免费、开源的审计工具例子是Clang Static Analyzer,该工具可以帮助你在常见API和漏洞编码形式中跟踪编程错误。
* [Source Navigator](http://sourcenav.sourceforge.net/)
* [Scitools Understand](http://www.scitools.com/)
* [Meld](http://meldmerge.org/)
* [Clang Static Analyzer](http://clang-analyzer.llvm.org/)
**资源**
要确定你对分析目标所用的编程语言非常地熟悉。发现漏洞的审计员相比初始开发软件的程序员要更加熟悉语言和代码库。在一些案例中,这种级别的理解可以简单通过关注可选编译器警告或通过第三方分析工具帮助跟踪常见编程错误而达到。计算机安全等同于计算机精通。对你的目标没有严苛的理解,也就没有抵御攻击的希望。
* [Essential C](https://trailofbits.github.io/ctf/vulnerabilities/references/EssentialC.pdf)——C语言编程入门
* [TAOSSA Chapter 6: C Language Issues](https://trailofbits.github.io/ctf/vulnerabilities/references/Dowd_ch06.pdf)——强烈推荐阅读
* [Integer Overflow](http://en.wikipedia.org/wiki/Integer_overflow)
* [Wireshark Security](https://wireshark.org/security/)——许多漏洞的例子
* [Gera's Insecure Programming by Example](http://community.coresecurity.com/~gera/InsecureProgramming/)——小型漏洞C程序的例子