返回导向编程(英語: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). 

📚 Artikel Terkait di Wikipedia

栈缓冲区溢出

已隱藏部分未翻譯内容,歡迎參與翻譯。 A variant of return-to-libc is return-oriented programming, which sets up a series of return addresses, each of which executes a small sequence

泛型编程

Object-Oriented Programming Systems, Languages and Applications), Portland (Oregon), 29 September–2 October 1986, pages 391–405. generic-programming.org

Python

[2020-09-25]. (原始内容存档于2012-10-26).  aspectlib. aspectlib is an aspect-oriented programming, monkey-patch and decorators library. It is useful when changing

SNOBOL

SNOBOL(StriNg Oriented and symBOlic Language),即“面向字符串且符号式的语言”,是以SNOBOL4告终的一系列编程语言,由AT&T贝尔实验室的David J. Farber(英语:David J. Farber)、Ralph E. Griswold(英语:Ralph

Ada

1) then return False; end if; end loop; return True; end is_palindrome; SPARK ISO/IEC 8652(英语:ISO 8652):Information technology — Programming languages

反射式编程

functional and object-oriented programming: a short comparative study (页面存档备份,存于互联网档案馆) An Introduction to Reflection-Oriented Programming Brian Foote's pages

REBOL

由do函数解释的“执行方言”,是一个面向表达式(英语:expression-oriented programming languages)的“数据交换方言”的子语言。语言的主要语义单元是表达式(英语:expression (programming))。对比于派生自ALGOL的指令式编程语言,“执行方言”既没有关键字也没有语句。

ALGOL 68

60後繼者。ALGOL 68的設計目標,是提供更廣泛的應用,以及更嚴格的語法定義。 ALGOL 68的特征包括基于表达式(英语:Expression-oriented programming language)的语法,用户声明的类型和结构与标签联合类型,变量与引用参数的引用模型,可变长数组和字符串、数组与矩阵的分片(英语:array