## 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/)