## 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程序的例子