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 offset
接下來就是尋找EIP的偏移量,很簡單,我們使用mona來尋找
生成測試字元:
繼續上面步驟後,查看EIP被覆蓋的值
使用mona找到偏移量1012
JMP ESP
接下來就尋找一個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思想
現在我們已經接觸到ROP技術的核心了,就是一個面向返回編程技術。核心思想就是收集一些現有的程序彙編指令,這些指令沒有被DEP標記為不可執行,然後將它們鏈接在一起,告訴操作系統讓我們的shellcode區域可執行。
我們收集的這些彙編指令被稱為小配件(gadgets),這些小工具通常是一堆地址的形式,這些地址指向有用的彙編指令,然後是返回或RET指令,以開始執行鏈中的下一個小配件。這就是為什麼它被稱為面向返回編程。
我們怎麼才能將shellcode區域標記為可執行呢?在Windows操作有很多辦法,本文我們將使用VirtualProtect()函數,想詳細了解這個函數請看下述鏈接:
介紹完理論,現在我們就要來實戰構建。
構建ROP Chain
首先,我們來看看想成功執行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原創獎勵計劃,未經許可禁止轉載
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)
※iOS 11相機BUG,恐讓用戶誤入惡意網站
※內網漫遊:通過RDP劫持向遠程系統執行任意代碼
TAG:FreeBuf |