當前位置:
首頁 > 最新 > Windows漏洞利用開發教程Part 5:返回導向編程

Windows漏洞利用開發教程Part 5:返回導向編程

* 本文作者:zusheng,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載

一、前言

漏洞——信息安全界最常見的辭彙,在百度百科是這樣描述的:

漏洞是在硬體、軟體、協議的具體實現或系統安全策略上存在的缺陷,從而可以使攻擊者能夠在未授權的情況下訪問或破壞系統。

本文主要介紹的是Windows軟體漏洞的利用開發教程。我花了大量的時間來研究了計算機安全領域Windows漏洞利用開發,希望能和大家分享一下,能幫助到對這方面感興趣的朋友,如有不足,還請見諒。

前文回顧

Windows漏洞利用開發教程Part 1

Windows漏洞利用開發教程Part 2:Short Jump

Windows漏洞利用開發教程Part 3:Egghunter

Windows漏洞利用開發教程 Part 4:SEH

二、準備階段

歡迎來到Windows漏洞利用開發的第五篇文章,今天我們將討論一種返回導向編程(ROP)技術,該技術通常用於解決被稱為數據執行保護(DEP)的安全措施。DEP是數據執行保護的英文縮寫,全稱為Data Execution Prevention。數據執行保護(DEP) 是一套軟硬體技術,能夠在內存上執行額外檢查以防止在系統上運行惡意代碼。

到目前為止,我們一直在使用Windows XP系統環境來學習如何攻擊具有較少安全機制的操作系統。經過前面的幾篇文章,我們是時候換一套新的系統環境啦,對於本教程,我們將使用Windows 7系統環境。

接下來我們再次在虛擬機中安裝Immunity Debugger,Python和mona.py。詳情請看第一篇文章。

準備就緒後我們開始學習ROP,目標軟體是VUPlayer,查看漏洞詳情或下載存在漏洞的軟體請看下述鏈接:

在開始之前,我們還需要確保Windows 7虛擬機的DEP已打開。

打開控制面板,系統和安全->系統,然後點擊高級系統設置

點擊設置,設置數據執行保護為下圖所示

三、漏洞利用開發分析

開始和之前是差不多的步驟,這也是漏洞利用開發必不可少的步驟,所以我們不再做詳細介紹了,只是大致演示一下怎麼分析獲取到一些必需的數據。


首先我們肯定需要編寫一個腳本來生成payload測試漏洞,這個漏洞在之前文章有介紹過。

我們是怎麼簡單怎麼來,主要生成一個3000字元的測試文件test.m3u

使用Immunity Debugger打開軟體VUPlayer.exe,在打開的對話框中點擊file-openplaylist打開測試文件test.m3u或者將測試文件test.m3u拖拽到VUPlayer對話框,可以發現EIP被A字元串覆蓋。


接下來就是尋找EIP的偏移量,很簡單,我們使用mona來尋找

生成測試字元:

繼續上面步驟後,查看EIP被覆蓋的值

使用mona找到偏移量1012


接下來就尋找一個JMP ESP,為什麼要尋找它,前面也介紹過了,通過將EIP覆蓋為它的地址跳出這樣就可以非常方便的布局堆棧,確保shellcode順利執行。

尋找JMP ESP的mona指令大家還記得吧

這樣我們就得到了EIP要覆蓋的地址0x1010539f

現在可以加入模擬shellcode來測試一下是否會順利執行shellcode

使用Immunity Debugger打開軟體VUPlayer.exe,在打開的對話框中點擊file-openplaylist打開測試文件test.m3u或者將測試文件test.m3u拖拽到VUPlayer對話框

你可以發現我們的shellcode並沒有執行,如果繼續下去程序就會崩潰,這是因為數據執行保護(DEP)阻止了我們shellcode的執行從而導致了程序的崩潰。但是,我們發現JMP ESP是執行了,所以說我們可以執行一些代碼,但這條代碼必須是現有的,就像我們之前可以運行的JMP ESP一樣,它存在被允許執行的代碼段中。這也正是ROP技術的關鍵所在。

四、ROP分析及構建

現在我們來看一下問題的核心是什麼,DEP阻止了操作系統將我們的0xCC解釋為INT指令,而不是它不知道0xCC是什麼東西。如果沒有DEP,操作系統就會知道0xCC是個INT指令,然後繼續執行這個指令。啟用DEP後,某些內存段就會被標記為NON-EXECUTABLE (NX),意思就是操作系統不會再將數據解釋為指令。但是DEP沒有說我們不能執行標記為可執行的現有程序指令,比如組成VUPlayer程序的代碼,這在前面我們可以執行JMP ESP代碼就可以看出了,因為該指令是在程序本身中找到的,被標記為可執行,因此程序可以運行。然而我們加入的shellcode是新的,所以它被放在了一個標記為不可執行的內存段。


現在我們已經接觸到ROP技術的核心了,就是一個面向返回編程技術。核心思想就是收集一些現有的程序彙編指令,這些指令沒有被DEP標記為不可執行,然後將它們鏈接在一起,告訴操作系統讓我們的shellcode區域可執行。

我們收集的這些彙編指令被稱為小配件(gadgets),這些小工具通常是一堆地址的形式,這些地址指向有用的彙編指令,然後是返回或RET指令,以開始執行鏈中的下一個小配件。這就是為什麼它被稱為面向返回編程。

我們怎麼才能將shellcode區域標記為可執行呢?在Windows操作有很多辦法,本文我們將使用VirtualProtect()函數,想詳細了解這個函數請看下述鏈接:

介紹完理論,現在我們就要來實戰構建。


首先,我們來看看想成功執行VirtualProtect()函數,需要哪些參數:

了解完參數,我們分析看看這些參數怎麼設置,lpAddress參數肯定設置為我們shellcode,dwSize設置為0x201,flNewProtect設置為0x40(常數,具體看下述鏈接),最後設置lpflOldProtect為任何靜態可寫的位置。接下來調用我們剛剛設置的VirtualProtect()函數就行了。

首先,讓我們找到小配件來構建VirtualProtect()函數所需的參數,點擊e來獲取屬於VUPlayer的可執行模塊。

要從我們選擇的模塊找到可用小配件列表,您可以在Mona中使用以下命令:

查看Mona生成的rop_suggestions.txt和rop.txt文件

讓我們來構建ROP chain

首先,讓我們出棧一個值到EBP中,後面調用PUSHAD:

通過取反得到值0x201,然後將值放入到EBX寄存器,作為參數dwSize的值

接下來,同樣道理得到值0x40,然後將值放入到EDX寄存器,作為參數flNewProtect的值

然後我們需要找到一個可寫位置地址,然後將值放入寄存器ECX中,作為參數lpflOldProtect的值

為了等下調用調用PUSHAD,我們將一些值放入到EDI和ESI寄存器中

最後,我們放入函數VirtualProtect()的地址來進行調用,EAX寄存器的值就是0x1060e25c

接下來就很簡單了,將我們設置的VirtualProtect()的寄存器壓入堆棧,直接用了PUSHAD和JMP ESP,PUSHAD壓入堆棧,JMP ESP轉到執行。

PUSHAD將按以下順序將寄存器值放在堆棧上:EAX、ECX、EDX、EBX、ESP, EBP, ESI,EDI。

Python:

五、漏洞利用開發實現

再寫腳本之前,我們要注意一下,現在我們要覆蓋的EIP地址只需要跳轉過去馬上回來就行了,所以我們直接找個RETN指令地址就行啦。

經過上面的分析,實現起來就很簡單了,具體請看下面代碼和注釋:

使用Immunity Debugger打開軟體VUPlayer.exe,在打開的對話框中點擊file-openplaylist打開測試文件test.m3u或者將測試文件test.m3u拖拽到VUPlayer對話框,shellcode成功執行。

堆棧情況:

六、總結

使用!mona rop命令,在日誌文件夾rop_chains.txt文件中也會自動生成一個完整的ROP chain,當然重點在於理解,如果自動生成的ROP chain在使用過程中出錯,就需要自己慢慢去分析並修改一些東西了。有攻必有防,攻與防總是相對的,在這裡感謝無私分享技術的安全研究人員,沒有他們的分享就沒有這篇文章。當然,我自認為自己了解還是太少了。還是那句話,本人水平有限,如有不足,還請各位兄弟指出。

* 本文作者:zusheng,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

iOS 11相機BUG,恐讓用戶誤入惡意網站
內網漫遊:通過RDP劫持向遠程系統執行任意代碼

TAG:FreeBuf |