ROP攻擊技術 學習筆記
x86_64天生具有免疫力
根據X86_64 ABI的呼叫約定,函式間傳遞引數不再以壓棧的方式,而是以暫存器方式傳遞引數,前面6個引數依次以rdi, rsi, rdx, rcx, r8和r9寄存來傳遞。
在Linux系統,64位架構只使用48位的虛擬地址空間,也即每個地址高16位全部為0,因此在64位系統上,地址已天然零化。
前面介紹的攻擊方法似乎一夜之間沒有用武之地,很快安全人員在ret2plt攻擊方法基礎上,做了一個升級片本的攻擊方法,稱為ROP(Return-oriented programming)方法。
何謂ROP
顧名思義ROP,就是面向返回語句的程式設計方法,它借用libc程式碼段裡面的多個retq前的一段指令拼湊成一段有效的邏輯,從而達到攻擊的目標。
為什麼是retq,因為retq指令返到哪裡執行,由棧上的內容決定,而這是攻擊者很容易控制的地址。
那引數如何控制,就是利用retq執行前的pop reg指令,將棧上的內容彈到指令的暫存器上,來達到預期
一段retq指令未必能完全到想攻擊目標的前提條件,那可在棧上控制retq指令跳到另一段retq指令表,如果它還達不到目標,再跳到另一段retq,直到攻擊目標實現。
在ret2plt攻擊方法,我們使用PPR(pop, pop, ret)指令序列,實現順序執行多個strcpy函式呼叫,其實這就是一種最簡單的ROP用法。ROP更是ret2plt的升級版
ROP方法技巧性很強,那它能完全勝任所有攻擊嗎?返回語句前的指令是否會因為功能單一,而無法實施預期的攻擊目標呢?業界大牛已經過充分
攻擊例項
在這裡省去對準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
- 1
- 2
這樣,可以將”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
- 1
- 2
- 3
- 4
於是,構建如下的執行順序:
pop %rax <— 這裡彈出system函式地址
pop %rbx
pop %rbp
retq <— 這裡從棧中跳到下段指令
lea 0x120(esp), %rdi <– 需要安排好”echo success”位置,使得此時的rsp + 0x120剛好是字串地址
call *%rax <– 呼叫system,引數剛好。
通過gdb檢視system函式的地址:
(gdb) p system
$4 = {<text variable, no debug info>} 0x7ffff7a61310 <system>
- 1
- 2
於是棧注入內容就很容易:
0x7fffff7a3b076 + address of system + dummy1 + dummy2 + 0x7ffff7a610a3 +dummy(0x120) + “echo success”
攻擊圖示
上面的攻擊例項中,指令的執行過程和棧注入記憶體佈局如下圖所示。
ROP可以為所欲為
上面提到已有研究員稱ROP攻擊借用的多個程式碼片段串起來的程式邏加是圖靈完備的,也即這個程式包含順序執行語句(這個當然是廢話),還有分支語句,甚至有迴圈語句。
稍有反編譯或者逆向工程經驗,或者對C語言生成的彙編結構熟悉都知道,retq指令是函式的返回指令,在此之前的指令是彈棧指令(如pop rax, pop rbx等),怎麼可以出現分支指僅(bne等),甚至迴圈指令呢?
是的,這個是事實,但不是事實的全部。如果將glibc進行逆向工程,會發現retq指令前向全是清一色的pop指令,但是事實上攻擊者總是不按常規出牌。
X86指令集是CISR指令集,密集度很高,一條指令中的一部分,也可能是一條新指令。
攻擊者就是利用這一點,不按常規出牌。retq指令就只有一個位元組,是C3。通過編寫工具,對glibc進行掃描,把C3的指令內容找到,然後向前解碼各種可能的指令,形成一個指令表。這些指令表會是非常豐富,有運算指令,轉跳指令,以及訪存指令。利用它們可以形成圖靈完備的計算邏輯。
相關推薦
ROP攻擊技術 學習筆記
x86_64天生具有免疫力 根據X86_64 ABI的呼叫約定,函式間傳遞引數不再以壓棧的方式,而是以暫存器方式傳遞引數,前面6個引數依次以rdi, rsi, rdx, rcx, r8和r9寄存來傳遞。 在Linux系統,64位架構只使用48位的虛擬地址空間,也即每個地址
Java核心技術學習筆記-繼承
java 繼承按照我們中文通俗的理解是不需要付出努力,就獲得別人的能力或資產,比如繼承父輩的家產,繼承父輩的表達能力,繼承父輩的外貌等等。在類裏面的繼承,可以理解不需要重新開發代碼,就能復用父類的方法和域。 在繼承關系裏面,可以分為父類和子類,子類繼承父類,那子類就有了跟父類一樣對外的方法
流媒體技術學習筆記之(三)Nginx-Rtmp-Module統計某頻道在線觀看流的客戶數
sele lec rest uri class origin 客戶 擴展 raw 獲得訂閱者人數,可以方便地顯示觀看流的客戶數。 查看已經安裝好的模塊 /usr/local/nginx/sbin/nginx -V 安裝從源編譯Nginx和Nginx-RTMP所
JavaScript核心技術學習筆記(1)——DOM基礎
無法 strong 元素節點 tor cli val 獲取元素 是什麽 標準 DOM基礎 一、DOM是什麽 Document object Model,文檔對象模型,是由W3C定義的一個標準。簡單來說,DOM裏面有很多方法,我們通過它提供的方法來操作一個頁面中的某個元素
JavaScript核心技術學習筆記(2)——DOM基礎(2)
轉換 替換元素 沒有 ack true html中 事件 想要 dom基礎 DOM基礎(2) 一、插入元素 上一篇文章中我們學會了如何創建元素,但僅僅是創建一個元素而沒有插入到HTML中,這是沒有意義的。插入元素有以下兩種方法: ? appendChild() ? inse
JavaScript核心技術學習筆記(4)——事件基礎
() block 發生 UNC spa on() strong 1.2 type 事件基礎 一、事件 事件是什麽? 舉個例子,我們在點擊一個按鈕時,會彈出一個對話框。其中,“點擊”就是一個事件,“彈出對話框”就是我們在點擊這個事件後發生的動作。 在JS中,一個事件應該有三個
機械製造技術學習筆記(七)
機械加工表面質量的影響因素及控制 參考內容: http://cms.sciencepress.cn/channelurl.jspx?channelId=2871 一、機械加工表面質量概述 1.機械加工表面質量內容 (1)表面幾何形狀特徵,包括表面粗糙度、波度(介於巨集觀幾何
java技術學習筆記:Maven安裝和作用
Maven是一個基於專案物件模型(POM)的概念的純java開發的開源的專案管理工具。主要用來管理java專案,進行依賴管理(jar包管理,能自動分析專案所需的依賴軟體包,併到Maven倉庫區下載)和專案構建(專案打包和部署)。此外還能分塊開發,提高開發效率。 本文將從以下三個方面寫起: 1
直播技術學習筆記(直播協議+流媒體伺服器+音視訊處理+FFmpeg)
直播協議 RTMP(Real Time Messaging Protocol) 簡介 Time Messaging Protocol,實時訊息傳送協議 RTMP是Adobe公司為Flash播放器和伺服器之間音訊、視訊和資料傳輸開發的開放協議。 協議:長連線TCP 原理:每
Java技術學習筆記:過濾器鏈的實現方法、配置和案例分析
今天給大家分享的是Java技術學習筆記:過濾器鏈的實現方法、配置和案例分析。 過濾器能夠對網站中的各種內容進行過濾(頁面、Servlet、圖片、檔案),可以在網站內容請求和響應時進行一些操作,完成一些通用的功能。 過濾器鏈 在專案中可以建立多個過濾器,網站內容可能會經過多個過濾器,多個過濾器就形成了過濾
計算機模擬技術學習筆記(一)
一、數學建模方法 1.建模的基本要求 (1)清晰性:模組化 (2)切題性:與研究目的相關 (3)資料準確、精確 2.建模的原則 (1)構築模組的思想 將系統的描述組織成一系列模組,每個模組代表系統的一個部分,每個部分可以由一個或多個輸入變數組成,同時產生多個輸出變數,系統作為一個整體就可以由不同
Java技術學習筆記:RMI與RPC的區別
一:RPC 遠端過程呼叫RPC(Remote Procedure Call Protocol)遠端過程呼叫協議,通過網路從遠端計算機上請求呼叫某種服務。一次RPC呼叫的過程大概有10步: 1.執行客戶端呼叫語句,傳送引數 2.呼叫本地系統傳送網路訊息 3.訊息傳送到遠端主機 4.伺服器得到訊息並取得引
大資料技術學習筆記之網站流量日誌分析專案:資料採集層的實現3
一、資料採集業務 -》資料來源 -》網站:使用者訪問日誌、使用者行為日誌、伺服器執行日誌 -》業務:
大資料技術學習筆記之網站流量日誌分析專案:網站業務與企業架構2
一、回顧 -》flume使用遇到的錯誤 -》少jar包 -》卡住不動:agent檔案不對 &nbs
大資料技術學習筆記之網站流量日誌分析專案:Flume日誌採集系統1
一、網站日誌流量專案 -》專案開發階段: -》可行性分析 -》需求分析
大資料技術學習筆記之hive框架基礎3-sqoop工具的使用及具體業務分析
一、CDH版本的介紹及環境部署 -》Hadoop的三大發行版本 -》Apache Hadoop -》
大資料技術學習筆記之hive框架基礎2-hive中常用DML和UDF和連線介面使用
一、分割槽表的介紹及使用 -》需求:統計每一天的PV,UV,每一天分析前一天的資料 -》第一種情況:每天的日誌儲存在同一個目錄中 &nbs
大資料技術學習筆記之hive框架基礎1-基本架構及環境部署
一、hive的介紹及其發展 "27.38.5.159" "-" "31/Aug/2015:00:04:37 +0800" "GET /course/view.php?id=27 HTTP/1.1" "303" "440" - "http://www.micro.com/user.php?act
大資料技術學習筆記之Hadoop框架基礎5-Hadoop高階特性HA及二次排序思想
一、回顧 -》shuffle流程 -》input:讀取mapreduce輸入的 &nbs
大資料技術學習筆記之Hadoop框架基礎1-Hadoop介紹及偽分散式部署
一、學習建議 -》學習思想 -》設計思想:分散式 -》資料採集