返回导向编程

返回导向编程（，缩写：）是计算机安全中的一种漏洞利用技术，该技术允许攻击者在程序启用了安全保护技术（如堆栈不可执行）的情况下控制程序执行流，执行恶意代码。其核心思想是通过棧緩衝區溢出等方式控制堆栈调用以劫持程序控制流并执行针对性的机器语言指令序列（称为Gadgets）。所谓 gadgets 就是以 ret 结尾的指令序列，通过这些指令序列，我们可以修改某些地址的内容，方便控制程序的执行流程。

分类 
依据对于 gadget 利用的形式，返回导向编程主要有以下几种类型：
 ret2text
 ret2shellcode
 ret2syscall
 ret2libc
 ret2dl_resolve
 ret2VDSO
 SROP
 BROP

背景

堆栈溢出攻击
ROP是一种高级的堆栈溢出攻击。这类攻击往往利用操作堆栈调用时的程序漏洞，通常是缓冲区溢出。在缓冲区溢出中，在将数据存入内存前未能正确检查适当范围的函数会收到多于正常承受范围的数据，如果数据将写入栈，多余的数据会溢出为函数变量分配的空间并覆盖替换返回地址（return address）。在原本用以重定向控制流并返回给调用者的地址被覆盖替换后，控制流将改写到新分配的地址。

标准的缓冲区溢出攻击，攻击者只需要写出针对堆栈部分的代码（有效载荷）。直到1990年代后期，主流操作系统没有为该类攻击作出任何防范，微软直到2004年才提供了缓冲区溢出保护。操作系统最终使用数据执行保护技术来修补这个漏洞，该技术标记内存数据不可执行。 启用数据执行保护，机器将拒绝执行任何内存中user级别可写区域的代码。该技术的硬件支持不久用以加强该防范。

相關條目 
 Return-to-libc攻击

保全漏洞