## 2.2、二進制審計
現在你已經深入到原生層,這是你撕扯下所有遮掩后的軟件。今天我們所關注的原生代碼形式是Intel X86下的32位代碼。Intel處理器從上世紀80年代開始在個人計算機市場有著強勁的表現,現在支配著桌面和服務器市場。理解這些指令集可以幫助你以內部視角看到程序每天是如何運行的,也可以在你遇到諸如ARM、MIPS、PowerPC和SPARC等其他指令集時提供一種參考。
這部分內容我們將要逐漸熟悉原生層和開發策略,以理解、分析和解釋本地代碼。在該部分結束時你應該能夠完成一項“逆向編譯”——從匯編分段到高級語言狀態——以及處理過程、派生意義和程序員意圖。
**課程**
學習X86初看起來令人生畏且需要一些專業性的學習才能掌握。我們建議閱讀《深入理解計算機系統》的第三章學習C程序是怎樣編譯成機器指令的。當你有了一些基礎的、這種過程的應用知識,就在手邊隨時備著像弗吉尼亞大學x86匯編指南這樣的參考指南。我們還發現了來自Quinn Liu的系列視頻作為快速介紹。
* 《深入理解計算機系統》第三章: [Machine-Level Representation of Programs](https://picoctf.com/docs/asmhandout.pdf)
* [x86 Assembly Guide](http://www.cs.virginia.edu/~evans/cs216/guides/x86.html)
* [Introduction to x86 Assembly](https://www.youtube.com/watch?v=qn1_dRjM6F0&list=PLPXsMt57rLthf58PFYE9gOAsuyvs7T5W9)
**挑戰工坊**
下面的程序都是“二進制炸彈”。逆向工程這些Linux程序并確定輸入序列就可以“拆除“炸彈。炸彈的每個連接層關注于原生代碼的不同層面。例如,CMU實驗室中的程序(CMU Binary Bomb Lab)中你會看到不同數據結構(鏈表、樹)以及控制流結構(切換、循環)在原生代碼層面怎樣表現的。在逆向這些程序時你可以發現將程序執行流程轉換為C或者其他高級語言的有用之處。
你應該將目標聚焦于解決這兩個實驗室程序的八個段。CMU炸彈程序有一個隱藏段,RPI炸彈程序有一個段包含有內存錯誤,你能找到并解決么?
* [CMU Binary Bomb Lab](http://csapp.cs.cmu.edu/public/bomb.tar)
* [RPI Binary Bomb Lab](http://www.cs.rpi.edu/academics/courses/spring10/csci4971/rev2/bomb)
**工具**
處理原生代碼的兩個至關重要的工具是調試器和反匯編器。我們建議你熟悉下行業標準反匯編工具:IDA Pro。IDA會分割代碼為獨立的塊以對應程序源碼的定義函數。每個函數進一步被分割為修改控制流的指令定義的“基礎塊”。這樣很容易一眼識別循環、條件和其他控制流指令。
調試器允許你與設置了斷點的運行中代碼進行交互和狀態檢查,以及內存檢查和寄存器內容查看。你會發現如果你的輸入沒有產生預期的結果,這些查看功能是很有用的,但是一些程序會使用反調試技術在調試時改變程序行為。對于大多數Linux系統來說GNU調試器(gdb)是標準的調試工具。gdb可以通過你所用Linux版本的軟件包管理器獲得。
* [IDA Pro Demo](https://www.hex-rays.com/products/ida/support/download_demo.shtml)
* [gdb](http://www.sourceware.org/gdb/)
**資源**
已經有許多好的資源用來學習x86匯編和CTF題目中的技巧。除了以上資源,x86維基手冊和AMD指令集幫助都是更加完整的參考供你參考(我們發現AMD幫助手冊沒有Intel幫助手冊那么嚇人)。
* AMD64程序員幫助手冊: [General-Purpose and System Instructions](http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2008/10/24594_APM_v3.pdf)
* [x86 Assembly Wikibook](https://en.wikibooks.org/wiki/X86_Assembly)
* [Computer Systems: A Programmer's Perspective](http://csapp.cs.cmu.edu/) (《深入理解計算機系統》)
一些逆向工程工具使用起來和匯編語言自身一樣復雜。下面列出的是常用的命令行工具的命令表單:
* [gdb Quick Reference](http://www.refcards.com/docs/peschr/gdb/gdb-refcard-a4.pdf)
* [IDA Quick Reference](https://www.hex-rays.com/products/ida/support/freefiles/IDA_Pro_Shortcuts.pdf)
* [WinDBG x86 Cheat Sheet](https://trailofbits.github.io/vulnerabilities/references/X86_Win32_Reverse_Engineering_Cheat_Sheet.pdf)
最后,許多CTF挑戰會使用反調試技術和反匯編技術隱藏或混淆目標。上面的炸彈程序就使用了其中的幾種技術,但是你可能想要更全面的參考資料。
* [Linux anti-debugging techniques](http://vxheavens.com/lib/vsc04.html)
* [The "Ultimate" Anti-Debugging Reference](http://pferrie.host22.com/papers/antidebug.pdf)