This paper provides a survey of methods and tools for automated code-reuse exploit generation. Such exploits use code that is already contained in a vulnerable program. The code-reuse approach allows one to exploit vulnerabilities in the presence of operating system protection that prohibits data memory execution. This paper contains a description of various code-reuse methods: return-to-libc attack, return-oriented programming, jump-oriented programming, and others. We define fundamental terms: gadget, gadget frame, gadget catalog. Moreover, we show that, in fact, a gadget is an instruction, and a set of gadgets defines a virtual machine. We can reduce an exploit creation problem to code generation for this virtual machine. Each particular executable file defines a virtual machine instruction set. We provide a survey of methods for gadgets searching and determining their semantics (creating a gadget catalog). These methods allow one to get the virtual machine instruction set. If a set of gadgets is Turing-complete, then a compiler can use a gadget catalog as a target architecture. However, some instructions can be absent. Hence we discuss several approaches to replace missing instructions with multiple gadgets. An exploit generation tool can chain gadgets by pattern searching (regular expressions) or considering gadgets semantics. Furthermore, some chaining methods use genetic algorithms, while others use SMT-solvers. We compare existing open-source tools and propose a testing system rop-benchmark that can be used to verify whether a generated chain successfully opens a shell.
翻译:本文对自动代码复制开发生成的方法和工具进行了调查。 此类开发使用使用的代码已经包含在一个脆弱的程序中。 代码复制方法允许人们在禁止执行数据存储的操作系统保护存在的情况下利用脆弱性。 本文描述各种代码复制方法: 返回到libc 攻击、 返回方向编程、 跳动方向编程等。 我们定义了基本术语 : 工具、 工具框架、 工具库等。 此外, 我们显示, 事实上, 一个工具是一个指令, 以及一组工具可以定义一个虚拟机器。 我们可以减少一个利用创建问题到这个虚拟机器的代码生成。 每个特定的可执行文件都定义了一个虚拟机器指令集 。 我们提供一种用于查找和决定其语义的方法调查( 创建一个工具图案目录 ) 。 这些方法可以让一个获得虚拟机器指令集。 如果一个工具组可以打开, 则一个编译者可以使用一个小工具库来定义一个虚拟工具库, 并且可以使用一个工具库来定义一个虚拟机器的游戏。 将一个小类目录作为这个虚拟机器的创建工具库作为目标机器的生成结构。 但是,, 某些可以使用一些可以使用常规的序列测试工具可以使用一个工具来取代一个工具 。 。 使用一个工具可以使用一个工具可以使用一个工具来复制工具来复制工具来复制一个工具 。 。 。 使用一个工具可以使用一个工具可以使用一个工具来复制一个工具来复制一个工具来复制一个工具来复制一个工具 。 。 。 使用一个工具来复制一个工具 使用一个工具 使用一个工具 使用一个工具 使用一个工具 使用一个工具 使用一个工具 。 使用一个工具 使用一个工具来复制一个工具 使用一个工具 使用一个工具 使用一个工具 使用一个工具 使用一个工具 使用一个工具 使用一个工具 使用一个工具 使用一个工具 。 使用一个工具 。