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等中)。
资源