## 3.1、二进制的漏洞利用(1)
二进制的漏洞利用是破坏编译程序的过程,令程序违反自身的可信边界从而有利于你——攻击者。本部分中我们将聚焦于内存错误。通过利用漏洞来制造软件内存错误,我们可以用某种方式重写恶意程序静态数据,从而提升特定程序的权限(像远程桌面服务器)或通过劫持控制流完成任意操作和运行我们所用的代码。
如果你尝试在已编译的C程序中找bug,知晓你要找的东西是很重要的。从认识你发送的数据被程序用在什么地方开始,如果你的数据被存储在一个缓冲区中,要注意到它们的大小。编写没有错误的C程序是非常难的,[CERT C Coding Standard](https://www.securecoding.cert.org/confluence/display/seccode/CERT+C+Coding+Standard)手册汇总了许多错误出现的方式。对[commonly misused APIs](http://stackoverflow.com/questions/4588581/which-functions-in-the-c-standard-library-commonly-encourage-bad-practice)稍加注意是可以加快了解的捷径。
一旦一个漏洞被确认,它就可以被用来威胁程序的完整性,然而,有各种不同的方式可以达到这个目标。对于像Web服务器这样的程序,获取另一个用户的信息可能是最终目标。另一方面,修改你的权限可能是有用的,比如修改一个本地用户权限为管理员。
**课程**
第一套课程是《Memory Corruption 101》,提供了Windows环境下缓冲区溢出利用一步一步的解释和相关背景。第二套课程《Memory Corruption 102》,涵盖了更多高级主题,包括Web浏览器漏洞利用。这两套课程都是针对Windows的例子,但技术和过程可以用于使用x86指令集的其他操作系统。记住,当你处理UNIX/Linux二进制时,函数名称和有时候的调用约定是不一样的。
* [Memory Corruption 101](http://vimeo.com/31348274)
* [Memory Corruption 102](http://vimeo.com/31831062)
**工具**
我们建议使用GDB来调试该部分的挑战题,因为它们都是在32位Linux下编译的,然而,GDB更适合用来调试源代码,而不是没有标识符和调试信息的纯粹二进制程序。诸如[gdbinit](https://github.com/gdbinit/gdbinit)、[peda](https://code.google.com/p/peda/)和[voltron](https://github.com/snarez/voltron)可以使gdb在调试无源码的程序时更有用。我们建议在你的home目录下创建一个至少包含以下命令的.gdbinit文件:
```
set disassembly-flavor intel
set follow-fork-mode child
```
**挑战工坊**
为了运行这些挑战题,你需要安装[Ubuntu 14.01(32-bit)](http://www.ubuntu.com/download/desktop/thank-you?country=US&version=14.04&architecture=i386)虚拟机。我们建议使用[VMware Player](https://my.vmware.com/web/vmware/free#desktop_end_user_computing/vmware_player/6_0),因为它免费且支持性很好。在你运行虚拟机后,打开终端并运行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端口监听指令。
**资源**
* [Using GDB to Develop Exploits – A Basic Run Through](http://www.exploit-db.com/papers/13205/)
* [Exploiting Format String Vulnerabilities](https://trailofbits.github.io/ctf/exploits/references/formatstring-1.2.pdf)
* [Low-level Software Security: Attacks and Defenses](https://trailofbits.github.io/ctf/exploits/references/tr-2007-153.pdf)