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

來源:互聯網
上載者:User

標籤:安全性   函數調用   軟體   資料   二進位   jpg   print   file   多個   

轉: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.