返回导向编程

返回导向编程(英语:Return-Oriented Programming,缩写:ROP)是计算机安全中的一种漏洞利用技术,该技术允许攻击者在程序启用了安全保护技术(如堆栈不可执行)的情况下控制程序执行流,执行恶意代码[1]。其核心思想是通过栈缓冲区溢出等方式控制堆栈调用以劫持程序控制流并执行针对性的机器语言指令序列(称为Gadgets[2]。所谓 gadgets 就是以 ret 结尾的指令序列,通过这些指令序列,我们可以修改某些地址的内容,方便控制程序的执行流程。[3]

“返回导向编程”的各地常用名称
中国大陆返回导向编程、面向返回程序设计、面向返回编程
台湾返回导向程式设计
港澳返回导向程式设计、返回导向编程

分类

依据对于 gadget 利用的形式,返回导向编程主要有以下几种类型:

  • ret2text
  • ret2shellcode
  • ret2syscall
  • ret2libc
  • ret2dl_resolve
  • ret2VDSO
  • SROP
  • BROP

背景

堆栈溢出攻击

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

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

相关条目

  1. ^ Vázquez, Hugo. Check Point Secure Platform Hack (PDF). Pentest. Barcelona, Spain: Pentest Consultores: 219. October 1, 2007 [2021-02-21]. (原始内容存档 (PDF)于2021-03-07). 简明摘要 (英语). 
  2. ^ Buchanan, E.; Roemer, R.; Shacham, H.; Savage, S. When Good Instructions Go Bad: Generalizing Return-Oriented Programming to RISC (PDF). Proceedings of the 15th ACM conference on Computer and communications security - CCS '08. October 2008: 27–38 [2021-02-21]. ISBN 978-1-59593-810-7. doi:10.1145/1455770.1455776. (原始内容存档 (PDF)于2017-08-11). 
  3. ^ 存档副本. [2021-04-19]. (原始内容存档于2021-04-23).