ROP系統攻擊

ROP全稱為Retrun-oriented Programmming(面向返回的編程)是一種新型的基於代碼復用技術的攻擊,攻擊者從已有的庫或執行檔中提取指令片段,構建惡意代碼。

ROP攻擊同緩衝區溢出攻擊,格式化字元串漏洞攻擊不同,是一種全新的攻擊方式,它利用代碼復用技術。

ROP的核心思想:攻擊者掃描已有的動態程式庫和執行檔,提取出可以利用的指令片段(gadget),這些指令片段均以ret指令結尾,即用ret指令實現指令片段執行流的銜接。作業系統通過棧來進行函式的調用和返回。函式的調用和返回就是通過壓棧和出棧來實現的。每個程式都會維護一個程式運行棧,棧為所有函式共享,每次函式調用,系統會分配一個棧楨給當前被調用函式,用於參數的傳遞、局部變數的維護、返回地址的填入等。棧幀是程式運行棧的一部分 ,在Linux中 ,通過%esp和 %ebp暫存器維護棧頂指針和棧幀的起始地址 ,%eip是程式計數器暫存器。而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攻擊將會在很大程度上受到抑制。

相關詞條

相關搜尋

熱門詞條

聯絡我們