ROP全稱爲Return-oriented Programming(面向返回的編程)是一種新型的基於代碼複用技術的攻擊,攻擊者從已有的庫或可執行文件中提取指令片斷,構建惡意代碼。
仍要利用棧溢出才能自由跳轉。
簡介編程
ROP攻擊同
緩衝區溢出攻擊,格式化字符串漏洞攻擊不一樣,是一種全新的攻擊方式,它利用代碼複用技術。
核心思想
ROP的核心思想:攻擊者掃描已有的
動態連接庫和可執行文件,提取出能夠利用的指令片斷(gadget),這些指令片斷均以ret指令結尾,即用ret指令實現指令片斷執行流的銜接。操做系統經過棧來進行函數的調用和返回。函數的調用和返回就是經過壓棧和出棧來實現的。每一個程序都會維護一個程序運行棧,棧爲全部函數共享,每次函數調用,系統會分配一個棧楨給當前被調用函數,用於參數的傳遞、局部變量的維護、返回地址的填入等。棧幀是程序運行棧的一部分 ,在
Linux中 ,經過%esp和 %ebp寄存器維護棧頂指針和棧幀的起始地址 ,%eip是程序計數器寄存器 [1] 。而ROP攻擊則是利用以ret結尾的程序片斷 ,操做這些棧相關寄存器,控制程序的流程,執行相應的gadget,實施攻擊者預設目標 。ROP不一樣於retum-to-libc攻擊之處在於,R0P攻擊以ret指令結尾的函數代碼片斷 ,而不是整個函數自己去完成預約的操做。從廣義角度講 ,return-to-libc攻擊是ROP攻的特例。最初ROP攻擊實如今x86體系結構下,隨後擴展到各類體系結構.。與以往攻擊技術不一樣的是,ROP惡意代碼不包含任何指令,將本身的惡意代碼隱藏在正常代碼中。於是,它能夠繞過W⊕X的防護技術。
內在特徵
ROP也有其不一樣於正常程序的內在特徵:
(1)ROP控制流中,call和ret指令不操縱函數,而是用於將函數裏面的短指令序列的執行流串起來,但在正常的程序中,call和ret分別表明函數的開始和結束;
(2)ROP控制流中,jmp指令在不一樣的庫函數甚至不一樣的庫之間跳轉,攻擊者抽取的指令序列可能取自任意一個二進制文件的任意一個位置,這很不一樣於正常程序的執行。好比,函數中部提取出的jmp短指令序列,可將控制流轉向其餘函數的內部;而正常程序執行的時候,jmp指令一般在同一函數內部跳轉。
ROP攻擊的防範:ROP攻擊的程序主要使用棧溢出的漏洞,實現程序控制流的劫持。所以棧溢出漏洞的防禦是阻擋ROP攻擊最根源性的方法。若是解決了棧溢出問題,ROP攻擊將會在很大程度上受到抑制。
注:Linux是一種開源操做系統,更準確地說Linux提供了內核 [2] ,其上運行 GNU 開源項目的各類程序 [3] ,提供了豐富的功能和強大的擴展性。事實上,基於 GNU / Linux 架構有不少 Linux 的不一樣發行版,比較著名的包括 Gentoo, Arch Linux, debian, Ubuntu, Fedora, Mandria, SUSE等,也有專一服務器端的 Redhat Enterprise,CentOS等。