1. 程式人生 > >ROP攻擊技術 學習筆記

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方法技巧性很強,那它能完全勝任所有攻擊嗎?返回語句前的指令是否會因為功能單一,而無法實施預期的攻擊目標呢?業界大牛已經過充分

研究並證明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
  • 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可以為所欲為

上面提到已有研究員稱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介紹及偽分散式部署

一、學習建議     -》學習思想         -》設計思想:分散式             -》資料採集