## 3.2、二進制的漏洞利用(2)
在該部分內容中,我們繼續可利用漏洞的本地應用檢查之路,并關注使用返回導向編程(ROP)來達到此目的。ROP是在代碼結尾的返回指令中整合現有可執行片段的過程。通過創建這些“玩意兒”地址鏈可以在不引入任何新代碼的情況下寫新程序。
記住,在可利用程序的漏洞識別方法上你需要靈活應變。有時候有必要在漏洞利用開發過程中對一個漏洞多次利用。有時,你可能僅想用ROP來讓你的shellcode執行,其他情況下,你可能想在ROP中完整寫一個攻擊載荷。偶爾,內存布局能使非常規的漏洞利用方法可行,例如,你可曾考慮過用ROP來構造一個不受控的格式化字符串漏洞?
**課程**
本部分的課程將討論返回導向編程(ROP)和繞過數據不可執行保護的代碼重用。這些在漏洞利用細節上會更具體,且基于上部分所討論的內容。
* [Return Oriented Exploitation](http://vimeo.com/54941772)
* [Payload already inside data re-use for ROP exploits](http://www.youtube.com/watch?v=GIZziAOniBE)(特指Linux)
**挑戰工坊**
和前一個部分的挑戰一樣,在你clone repository后文件夾中有兩個可執行文件。每個程序的漏洞利用都需要使用返回導向編程以讀取flag。此次的挑戰題沒有提供源代碼的訪問。你需要對二進制程序進行逆向工程來發掘漏洞,并需要將漏洞利用的技術。同樣,請使用相同的Ubuntu 14.04(32-bit)虛擬機。
**挑戰題:brute_cookie**
運行bc程序,它會監聽12345端口。
**挑戰題:space**
運行作為space程序的host.sh,它會監聽12348端口。
**挑戰題:rop_mixer**
運行作為rop_mixer程序的host.sh,它會監聽12349端口。
**工具**
參考前面所提到的工具。如果你還沒有準備,你需要熟悉一下*NIX的binutils套件。像readelf、strings、objdump、objcopy和nm都是常用的有用工具。請使用軟件包管理器和幫助頁面安裝和閱讀它們的使用。
有幾個現有的工具專門用來創建可重用代碼的漏洞,它們比一般的反匯編器更加專業,因為它們會尋找合適的可執行代碼段作為ROP目標(在指令、.rodata等中)。
* [RP](https://github.com/0vercl0k/rp)
* [ROPGadget](https://github.com/JonathanSalwan/ROPgadget)
* [BISC](https://github.com/trailofbits/bisc/)——適用于課程的簡單工具
**資源**
* [x86-64 buffer overflow exploits and the borrowed code chunks exploitation technique](https://trailofbits.github.io/ctf/exploits/references/no-nx.pdf)
* [Surgically returning to randomized lib(c)](https://trailofbits.github.io/ctf/exploits/references/acsac09.pdf)
* [Extensive security reference](https://code.google.com/p/it-sec-catalog/wiki/Exploitation)
* [Dartmouth College: Useful Security and Privacy links](http://althing.cs.dartmouth.edu/secref/resources/buffer_overflows.shtml)
* [Corelan Team Blog](https://www.corelan.be/index.php/articles/)