初識ROP 返回導向程式設計

2021-06-19 01:04:49 字數 1739 閱讀 4702

在說rop之前,先來說一下什麼是緩衝區溢位漏洞。緩衝區溢位漏洞(buffer overflow)是當今軟體系統最主要的安全漏洞,利用緩衝區溢位漏洞的攻擊也是攻擊者最常用的攻擊方式之一。所謂緩衝區溢位,是指在應用程式或者系統程式的記憶體中寫入超長資料,從而達到惡意改變或者控制程式執行流程的目的。攻擊者通過緩衝區溢位把shellcode寫入程式的記憶體空間,並且通過覆蓋棧上函式的返回位址,即eip暫存器所指向的記憶體位址的值,或者覆蓋seh鍊錶來實現程式執行流程的控制,使得植入記憶體的shellcode得以執行。

棧溢位(stack-based buffer overflows)算是安全界常見的漏洞。一方面因為程式設計師的疏忽,使用了 strcpy、sprintf等不安全的函式,增加了棧溢位漏洞的可能。另一方面,因為棧上儲存了函式的返回位址等資訊,因此如果攻擊者能任意覆蓋棧上的資料,通常情況下就意味著他能修改程式的執行流程,從而造成更大的破壞。

對於以上的漏洞,人們找出了很多解決的辦法。目前最受關注的是w⊕x技術,即通過硬體或軟體的支援,來保證程序映像中的記憶體區域不能同時可執行或可寫入。在windows平台下,稱為資料執行保護技術(data execution protection,dep);而在linux平台下則是通過pax專案實現。

在此基礎上,出席那了新的攻擊技術return-to-libc,攻擊者不通過寫入shellcode到漏洞程式的程序空間,而是利用已經在記憶體空間中的可執行**來執行任意操作,如libc中有一些函式可以用於執行其他的程序,例如 execve和 system。攻擊者只要找到乙個棧溢位漏洞,並適當的構造函式呼叫引數,並使棧上返回位址指向這些函式的起始位址,攻擊者就能以這個程式的許可權執行任意其他程式了。(這裡有一篇實現攻擊的**:

return_to_libc.pdf

)。這種攻擊方法也有侷限性,就是需要當前**庫有 system 這樣符合要求的函式,否則就涼拌了。

於是安全人員又提出了一種新的技術,就是今天需要我去學習的返回導向程式設計技術(return-oriented programming,rop)。所謂rop,簡單的說就是把原來已經存在的**塊拼接起來,拼接的方式是通過乙個預先準備好的特殊的返回棧,裡面包含了各條指令結束後下一條指令的位址。

在一般程式裡面,都包含著大量的返回指令(ret),他們基本位於函式的尾部,或是函式中部需要返回的地方。而從函式開始的地方到ret指令之間的這一段序列稱為二進位制指令**塊(gadgets)。這些二進位制指令串行使其組合成完成一些諸如讀寫記憶體、算術邏輯運算、控制流程跳轉、函式呼叫等操作。於是,我們就可以通過利用記憶體空間中各個gadgets以某種順序執行,達到進行任意操作的目的。而為了使各個gadgets「拼接」起來,我們就需要構造乙個特殊的返回棧。首先讓指向我們構造的棧(stack)的指標跳到gadget a中,執行其中的**序列後ret回我們的stack中,然後下一步是跳到gadget b,執行後就到gadgets c……只要stack足夠大,就能達到我們想要的效果。

rop難以構造的地方在於,我們需要在整個記憶體空間中搜尋我們需要的gadgets,這要花費很長的時間。一旦完成「搜尋」和「拼接」的步驟,這樣的攻擊卻是難以抵擋的,因為它用到的都是記憶體中合法的**。目前,已經有實驗室提出了包括乙個掃瞄可利用**、並把它們結合起來的constructor,一套專用的語言,以及把這套語言編譯成對應**片段之和的編譯器,最後還有乙個計算實際**位址的loader。(傳送門

)至於防護的方法,我就找到兩篇相關的資料。現在主流的辦法分別有:解決棧溢位問題、使用「金絲雀」方法偵測和預防棧溢位、去掉所有的ret指令、增加位址隨機性等。在《基於return-oriented programming的程式攻擊與防護》這篇文章中講述以上方法的詳細實現。傳送門

結對程式設計初識

在結對程式設計的task中,主要又分為了概念性認識和具體推行兩個子任務。這次主要還是單元測試理論性的一些基本認識吧。結對程式設計就是兩位程式設計師坐在同一工作台前開發軟體。也就是說,兩位程式設計師來完同乙個設計,乙個作為領航者在後邊說 怎麼寫,另乙個作為實施者寫 對專案 1 兩個程式設計師具有相同的...

網路程式設計初識

在日常生活中我們常見 應用程式,如qq,網盤,等 還有在瀏覽器上執行的 它們分別基於cilent server架構和browser server架構。c s架構 客戶端與伺服器端架構。b s架構 瀏覽器端與伺服器端架構。計算機在網路中的位置 我如何能夠準確地找到一台計算機,並且和它通訊呢 每一台計算...

初識網路程式設計

python高階 網路程式設計 網路通訊中最重要的就是網路通訊協議。當今網路協議有很多,區域網中最常用的有三個網路協議 microsoft的netbeui novell的ipx spx和tcp ip協議。應根據需要來選擇合適的網路協議。比如你在家裡給遠方的朋友使用qq打 或者發訊息說明 網路就是一種...