ROP攻擊技術

2021-07-28 12:31:49 字數 2706 閱讀 2409

前面介紹了ret2libc和ret2plt,這兩個攻擊技術的相通點是函式引數是通過壓棧來傳遞,這也是i386架構的呼叫約定。然而隨著64位伺服器的普及,以及後來越來越廣泛,以致幾乎所有伺服器都公升級到64位的硬體上。

根據x86_64 abi的呼叫約定,函式間傳遞引數不再以壓棧的方式,而是以暫存器方式傳遞引數,前面6個引數依次以rdi, rsi, rdx, rcx, r8和r9寄存來傳遞。

在linux系統,64位架構只使用48位的虛擬位址空間,也即每個位址高16位全部為0,因此在64位系統上,位址已天然零化。

前面介紹的攻擊方法似乎一夜之間沒有用武之地,很快安全人員在ret2plt攻擊方法基礎上,做了乙個公升級片本的攻擊方法,稱為rop(return-oriented programming)方法。

顧名思義rop,就是面向返回語句的程式設計方法,它借用libc**段裡面的多個retq前的一段指令拼湊成一段有效的邏輯,從而達到攻擊的目標

為什麼是retq,因為retq指令返到**執行,由棧上的內容決定,而這是攻擊者很容易控制的位址。

那引數如何控制,就是利用retq執行前的pop reg指令,將棧上的內容彈到指令的暫存器上,來達到預期

一段retq指令未必能完全到想攻擊目標的前提條件,那可在棧上控制retq指令跳到另一段retq指令表,如果它還達不到目標,再跳到另一段retq,直到攻擊目標實現。

在ret2plt攻擊方法,我們使用ppr(pop, pop, ret)指令序列,實現順序執行多個strcpy函式呼叫,其實這就是一種最簡單的rop用法。rop更是ret2plt的公升級版

rop方法技巧性很強,那它能完全勝任所有攻擊嗎?返回語句前的指令是否會因為功能單一,而無法實施預期的攻擊目標呢?業界大牛已經過充分研究並證明rop方法是圖靈完備的,換句話說, rop可以借用libc的指令實現任何邏輯功能。

在這裡省去對準eip以及漏洞**分析,直奔主題,如何構造rop指令順列來實現攻擊邏輯。

簡單起來,攻擊目標為實現system(「echo success」) 這個函式呼叫。

首先,呼叫system的引數為」echo success」字串的位址,而字串是棧注入的內容,那它的位址應該是rsp + offset。而函式呼叫時,第乙個引數是放到rdi寄存裡面。 所以需要從libc裡面,在retq或者call *reg指令前找到rdi = rsp + offset邏輯等價的指令序順,發現有如下的兩條指令:

0x7ffff7a610a3      lea 0x120(%rsp),%rdi

0x7ffff7a610ab call %rax

這樣,可以將」echo success」字串安排在rsp + 0x120的位置。但往下一條指令,要指令call %rax,因此需要在指令這個指令段前控制rax的值必須為system函式的位址。

然後,想將system位址放到rax相當容易,只需要在retq指令令,找到pop rax指令即可,從libc裡面查詢,發現如下:

0x7ffff7a3b076: pop %rax

0x7ffff7a3b077: pop %rbx

0x7ffff7a3b078: pop %rbp

0x7ffff7a3b0f9: retq

於是,構建如下的執行順序:

pop %rax

pop %rbx 

pop %rbp 

retq

lea 0x120(esp), %rdi

call *%rax

(gdb) p system

$4 = 0x7ffff7a61310

於是棧注入內容就很容易: 

0x7fffff7a3b076 + address of system + dummy1 + dummy2 + 0x7ffff7a610a3 +dummy(0x120) + 「echo success」

上面的攻擊例項中,指令的執行過程和棧注入記憶體布局如下圖所示。

上面提到已有研究員稱rop攻擊借用的多個**片段串起來的程式邏加是圖靈完備的,也即這個程式包含順序執行語句(這個當然是廢話),還有分支語句,甚至有迴圈語句。

稍有反編譯或者逆向工程經驗,或者對c語言生成的彙編結構熟悉都知道,retq指令是函式的返回指令,在此之前的指令是彈棧指令(如pop rax, pop rbx等),怎麼可以出現分支指僅(bne等),甚至迴圈指令呢?

是的,這個是事實,但不是事實的全部。如果將glibc進行逆向工程,會發現retq指令前向全是清一色的pop指令,但是事實上攻擊者總是不按常規出牌。

x86指令集是cisr指令集,密集度很高,一條指令中的一部分,也可能是一條新指令。

攻擊者就是利用這一點,不按常規出牌。retq指令就只有乙個位元組,是c3。通過編寫工具,對glibc進行掃瞄,把c3的指令內容找到,然後向前解碼各種可能的指令,形成乙個指令表。這些指令表會是非常豐富,有運算指令,轉跳指令,以及訪存指令。利用它們可以形成圖靈完備的計算邏輯。

關於rop 的攻擊的具體實現:

具體實施rop 攻擊的時候,由於找到所有合適的 gadgets 非常困難,花費的時間也很多。所有某些情況下,會 找到gadgets 去remove 掉 dep , 使堆疊有執行許可權,進而方便實施 buffer overflow 攻擊。 這個方法會簡化攻擊難度。

ROP攻擊初試 Return2PLT

補充 有點迷,感覺像是return2libc,通篇攻擊貌似沒有涉及到ptl 具體內容在這裡摘取操作步驟,原理有待以後補充 關於plt的介紹來自 最後解釋了一下為什麼寫入資料位元組數是28個a procedural linkage table,也就是plt是過程鏈結表,為每個全域性變數儲存了一段 第一...

使用ROP攻擊繞過Windows的DEP

各函式在windows各個系統的存在情況如下,其中 1 代表不存在,2 代表將由於預設dep策略設定而失敗 繞過dep需要構造rop鏈,rop鏈的作用就是用一連串的gadgets來實現這些函式的呼叫關閉dep保護,然後轉到shellcode上執行。0x?pop ebp retn 0x?ptr set...

網路攻擊技術

1 網路嗅探的原理 網路攻擊者如果能夠通過網路嗅探工具獲得目標計算機網路傳輸的資料報,就可以通過對資料報按照協議進行還原和分析,從而獲取目標計算機傳輸的大量資訊。因此,網路嗅探技術是一種威脅性極大的非主動類資訊獲取攻擊技術。對目標計算機的網路進行嗅探可以通過sniffer類工具 即網路嗅探器 來完成...