3.1、二进制的漏洞利用(1)
二进制的漏洞利用是破坏编译程序的过程,令程序违反自身的可信边界从而有利于你——攻击者。本部分中我们将聚焦于内存错误。通过利用漏洞来制造软件内存错误,我们可以用某种方式重写恶意程序静态数据,从而提升特定程序的权限(像远程桌面服务器)或通过劫持控制流完成任意操作和运行我们所用的代码。
如果你尝试在已编译的C程序中找bug,知晓你要找的东西是很重要的。从认识你发送的数据被程序用在什么地方开始,如果你的数据被存储在一个缓冲区中,要注意到它们的大小。编写没有错误的C程序是非常难的,CERT C Coding Standard手册汇总了许多错误出现的方式。对commonly misused APIs稍加注意是可以加快了解的捷径。
一旦一个漏洞被确认,它就可以被用来威胁程序的完整性,然而,有各种不同的方式可以达到这个目标。对于像Web服务器这样的程序,获取另一个用户的信息可能是最终目标。另一方面,修改你的权限可能是有用的,比如修改一个本地用户权限为管理员。
课程
第一套课程是《Memory Corruption 101》,提供了Windows环境下缓冲区溢出利用一步一步的解释和相关背景。第二套课程《Memory Corruption 102》,涵盖了更多高级主题,包括Web浏览器漏洞利用。这两套课程都是针对Windows的例子,但技术和过程可以用于使用x86指令集的其他操作系统。记住,当你处理UNIX/Linux二进制时,函数名称和有时候的调用约定是不一样的。
工具
我们建议使用GDB来调试该部分的挑战题,因为它们都是在32位Linux下编译的,然而,GDB更适合用来调试源代码,而不是没有标识符和调试信息的纯粹二进制程序。诸如gdbinit、peda和voltron可以使gdb在调试无源码的程序时更有用。我们建议在你的home目录下创建一个至少包含以下命令的.gdbinit文件:
set disassembly-flavor intel
set follow-fork-mode child
挑战工坊
为了运行这些挑战题,你需要安装Ubuntu 14.01(32-bit)虚拟机。我们建议使用VMware Player,因为它免费且支持性很好。在你运行虚拟机后,打开终端并运行sudo apt-get install socat来安装socat。
在此次挑战工坊中共有三道挑战题,当你在git中clone该手册的repository后,每道题都包含在其目录中,每道题的最终目标是操纵执行流以读取flag。对于每道题,请尝试将反汇编转换为C代码。在尝试之后,你可以通过查看提供的实际C源码来确认你的猜测,然后,尝试利用漏洞来读取flag。
挑战题:Easy
确认目录中easy程序的flag。当你执行easy后,它会在12346端口监听指令。
挑战题:Social
和easy类似,确认目录中social程序的flag和作为social程序的host.sh。当你执行social后,它将在12347端口监听指令。
资源