1. 程式人生 > >轉:初探Windows Fuzzing神器----Winafl

轉:初探Windows Fuzzing神器----Winafl

如何 用戶 代碼 參數 sprint 指令 memcpy 介紹 admin

轉:http://www.tuicool.com/articles/j2eqym6

小結:找到感興趣的函數,計算偏移,自動化fuzz.

這是一篇客座文章,作者是烏雲二進制漏洞挖掘白帽子 k0shl 。其實上個月17號,本文就已經寫完了,但是我們一直“捂”到了今天。算是給二進制方向的白帽子的七夕禮物吧 : )

0x01 什麽是 winafl

其實說的 afl-fuzz 大家都不會很陌生, afl-fuzz 是 Linux 用於 fuzz 文件格式,協議等二進制漏洞的神器,而 winafl 則是 afl-fuzz 的 Windows 版,最近我對 winafl 進行了一些淺層研究,由於之前也進行過一段時間的二進制漏洞挖掘,但基本上都是停留在手工挖掘上,越發覺得自動化神器功能的強大,也為以後自己開發 fuzz 工具提供了很重要的指導依據。

Winafl 到底是什麽?

Winafl 是 windows 下一種挖掘文件格式,協議漏洞的半自動化工具,為什麽說半自動化呢,因為針對特定的軟件, Winafl 並沒有提供一個全面的樣本庫,雖然 winafl 確實提供了一些測試樣本,但實際上真正 fuzz 的過程中,很多文件需要自己手工構造。

其次比起自動 fuzz , Winafl 需要自己手動定位需要 fuzz 的函數地址偏移,來確定具體要進行 fuzz 的函數位置。

那麽相比較來說 winafl 到底優勢在哪呢?這裏我要提一下我的理解, winafl 的優勢在於它采用的是代碼擴展來確定輸入輸出,以此來判斷漏洞是否存在,這麽說可能大家比較暈乎。

這個原理有點像 PIN 插件, PIN 插件是微軟提供的一種類似用於匯編指令擴展的插件,我用一張圖來簡單描述一下這個過程。

技術分享

如何理解這個過程,可以想象鉤子,插樁等過程,在函數進入和函數返回時,檢查程序輸入輸出是否符合預期等等,通過插入一些“額外”的指令來進行檢查,這樣,對崩潰位置定位更加精準,誤報率極低等等。

剛開始如何學習 fuzz

有很多剛開始接觸二進制,或者學過一段時間二進制的小夥伴會問我如何去挖掘,或者剛開始如何學習挖掘二進制漏洞的方法,其實我想說二進制漏洞挖掘是一個很難的過程,隨著現在一些類似於 strcpy_s ,或者說軟件安全性越來越好, fuzz 的難度越來越高,想要挖掘高級漏洞,需要一些入門的知識,我的水平不高,在這裏跟大家分享一些我做 fuzz 的心得,也是為之後利用 winafl 進行 fuzz 做一些鋪墊。

在入門的漏洞挖掘中,最重要的是關註程序可能存在的脆弱點,其實和 web 很像,在二進制中,用戶輸入也應該是不可信的,而這裏所謂的脆弱點,就是存在於用戶輸入和程序交互的過程中,比較有趣的函數有: strcpy , memcpy , sprintf , read 等函數,指針傳遞,指針賦值等操作中。

下面我來舉一個簡單的例子,通過 IDA 分析一個軟件,發現有一處比較有趣的調用。

技術分享

這裏我們關註到調用了一處 strcpy 的調用,我們可以通過 windbg 附加調試,在 j_strcpy 位置下斷點,這樣,程序執行中,如果調用了這處函數,就會命中這處斷點(當然,這裏用 OllyDBG也是可以的)。

技術分享

在敏感函數位置下斷點,通過對樣本的附加執行等等方法,直到命中斷點,再對函數執行前後的輸入輸出進行判斷,來確定樣本是否可以造成程序崩潰,是否可控,是否是一處可造成拒絕服務或者代碼執行的漏洞。

技術分享

通過後續執行情況,判斷棧空間的覆蓋情況,來確定這裏是否是一處可利用的漏洞,可以看到,此時棧回溯已經被畸形字符串沖垮,這個畸形字符串是構造樣本中,用戶可控的字符串部分。

這裏只是簡單的講述了一下最簡單的二進制漏洞挖掘過程,其實仔細回想我描述的這個過程,對函數進入推出時輸入輸出的檢查,也就是增加一個類似於指令擴展的過程,那麽其實就是自動化 fuzz 一個簡單的模型。

0x02 Winafl fuzz 前的準備

這裏,我們使用一個名為 VUPlayer 的軟件來利用 Winafl fuzz 進行一次簡單的漏洞挖掘,看過網上 afl-fuzz 教程的小夥伴可能會發現其實這個挖掘過程耗時很長,指令擴展一定意義上加大了代碼冗余,增加了執行時間,這裏我提供一個可以觸發 VUPlayer 緩沖區溢出漏洞的 PoC ,只是為了講解 Winafl fuzz 的使用和簡單原理。

尋找一個可能存在的脆弱點

之前我提到了 Winafl fuzz 使用時需要提供一個函數偏移,而在上面的簡單漏洞挖掘中,我提到了對敏感函數的尋找,那麽我們就來看一下 VUPlayer 的函數結構,利用 IDA 分析一下 VUPlayer的函數部分。

技術分享

發現函數調用了一個系統 dll 的函數 lstrcpyA ,這樣回溯這個 lstrcpyA ,發現了一處函數。

技術分享

那麽我們就選擇這個函數進行 fuzz ,函數入口偏移就是 0x532a0 ,接下來要開始準備 fuzz了。

DynamoRIO 是什麽?

在 fuzz 前,不得不提到 winafl fuzz 必須要用到的 DynamoRIO ,這個軟件我也是第一次聽說,可能很多二進制的老司機對它都不陌生,其實粗略看過 winafl 的源碼之後,我發現其實 winafl 很多的實現上,都借用了 DynamoRIO ,在這兩者之間建立了通信管道從而實現兩者之間的調用。

而 DynamoRIO 應該算是 winafl 的核心部分,它主要實現的是指令動態插樁,其實就是之前我提到的指令擴展,對函數輸入輸出進行一定的檢查。關於 DynamoRIO 的原理以及介紹在網上有很多描述,這裏不做過多介紹了。

DynamoRIO 測試過程

這裏我們要用到的是 DynamoRIO 的 ddrun.exe 工具,代碼如下

<code>

path\to\DynamoRIO\bin64\drrun.exe-c winafl.dll -debug -target_module [target exe or dll]VUPlyaer.exe -target_offset0x532a0 -fuzz_iterations 10 -- [target exe]VUPlayer.exe </code>

這裏需要進行一些簡單的解釋,首先是 -D ,用於和 afl fuzz 進行鏈接,主要是調用 winafl.dll ,target_module 是測試目標模塊, target_offset 是偏移,這樣的話會打開目標程序。

技術分享

接下來附加一個樣本,發現程序崩潰了,其實這時候,在目標目錄下會生成一個 log 文件。

技術分享

這個 log 文件實際上記錄了測試 VUPlayer 過程中,加載的模塊,以及記錄了偏移函數位置的變化情況,可以對這個崩潰場景進行一個簡單的分析。

技術分享

技術分享

0x03 Winafl fuzz 與核心源碼淺析

使用 Winafl 進行 fuzz

了解了 Dynamoafl fuzz 的基本工作流程之後,我們可以使用 winafl 進行漏洞挖掘,實際上, winafl 需要提供多個樣本才能對目標程序進行挖掘。

這裏為了介紹 winafl ,我們仍然使用能對目標程序造成崩潰的樣本文件。

<code>

C:\ProgramFiles\VUPlayer>afl-fuzz.exe -i in -o out -D C:\Users\Administrator\De

sktop\DynamoRIO-Windows-6.1.1-3\DynamoRIO-Windows-6.1.1-3\bin32-t 20000 -- -fuz

z_iterations 5000-target_module VUPlayer.exe -target_offset 0x532a0 -nargs 2 -- VUPlayer.exe @@

</code>

這裏仍然需要對參數進行一些簡單說明,首先 afl-fuzz 需要和 winafl.dll 同時處於目標文件夾下, -i 參數是用於記錄輸入樣本, -o 參數用於保存輸出數據, -D 則是 DynamoRIO 的路徑, -t是樣本測試延時, -target_offset 是要測試函數的偏移。

技術分享

當接觸到崩潰的時候。

技術分享

結果分析

當 winafl 碰到崩潰場景的時候,會在 -o 設定的文件夾下生成一系列文件,會詳細記錄指令擴展中產生的各種信息。

技術分享

Crashes 文件記錄了崩潰樣本, queue 記錄了指令擴展中的各種信息, cur_input 是當前輸入信息。

技術分享

只需要產生 crash 之後對指令進行分析就可以很清晰的分析到這個函數輸入輸出發生了什麽。或者說,獲取了可以崩潰的樣本之後,直接附加 windbg 復現這個漏洞,也能很快的分析出漏洞的成因。

技術分享

源代碼中的關鍵點

之前提到了 DynamoRIO 在 winafl fuzz 中的重要性,其實在源碼中有很多部分都有體現,下面從源碼的角度來看一些在 fuzz 中的關鍵點。

技術分享

這個位置會定義 dynamorio 的路徑,以便後續會調用到 dynamorio 中的工具。

技術分享

構造指令插樁的關鍵語句,可以看到這裏調用了 ddrun ,是 DynamoRIO 動態插樁的核心工具。

技術分享

目標進程崩潰的進程信息。其實還有很多,比如進程重啟機制,指令擴展後記錄輸入輸出,關鍵函數地址等信息的部分等等。

轉:初探Windows Fuzzing神器----Winafl