3.2、二进制的漏洞利用(2)

在该部分内容中,我们继续可利用漏洞的本地应用检查之路,并关注使用返回导向编程(ROP)来达到此目的。ROP是在代码结尾的返回指令中整合现有可执行片段的过程。通过创建这些“玩意儿”地址链可以在不引入任何新代码的情况下写新程序。

记住,在可利用程序的漏洞识别方法上你需要灵活应变。有时候有必要在漏洞利用开发过程中对一个漏洞多次利用。有时,你可能仅想用ROP来让你的shellcode执行,其他情况下,你可能想在ROP中完整写一个攻击载荷。偶尔,内存布局能使非常规的漏洞利用方法可行,例如,你可曾考虑过用ROP来构造一个不受控的格式化字符串漏洞?

课程

本部分的课程将讨论返回导向编程(ROP)和绕过数据不可执行保护的代码重用。这些在漏洞利用细节上会更具体,且基于上部分所讨论的内容。

挑战工坊

和前一个部分的挑战一样,在你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等中)。

资源