[课业] | 软件安全 | 使用American Fuzzy Lop工具挖掘C/C++程序漏洞
生活随笔
收集整理的這篇文章主要介紹了
[课业] | 软件安全 | 使用American Fuzzy Lop工具挖掘C/C++程序漏洞
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 概念介紹
- 1. 模糊測試的概念
- 1.1 模糊測試技術的核心思想
- 1.2 模糊測試的方法
- 2. 模糊測試的過程
- 2.1 確定測試目標
- 2.2 確定預期輸入
- 2.3 生成模糊測試用例
- 2.4 執行模糊測試用例
- 2.5 監視異常
- 2.6 異常分析并確認漏洞
- 實驗流程
- 1. 安裝AFL
- 2. 安裝漏洞語料庫、目標C程序
- 3. 開始測試
- 參考內容
概念介紹
1. 模糊測試的概念
1.1 模糊測試技術的核心思想
- 模糊測試(Fuzz Testing)主要屬于黑盒測試和灰盒測試領域,是一種基于缺陷注入的軟件安全測試技術。
- 模糊測試技術的核心思想是通過監視非預期輸入可能產生的異常結果來發現軟件問題。
- 具體來說就是使用大量半有效的數據,以程序是否出現異常作為標志,發現應用程序中結構可能存在的安全漏洞。
- 半有效數據是指,對應用程序來說,測試用例的必要標識部分和大部分數據是有效的,這樣待測程序就會認為這是一個有效的數據,但是同時該數據的其他部分是無效的。這樣,應用程序就有可能發生錯誤,這種錯誤可能導致應用程序的崩潰或者觸發相應的安全漏洞。
1.2 模糊測試的方法
- 模糊測試可以簡單到隨意敲打鍵盤來輸入隨機數據。
- 早期的模糊測試方法多是基于對單一數據進行一維或多維變異來形成測試數據。當前,模糊測試已經演變成了更為有效的、自動化更加健全的技術。
- 模糊測試方法分類如下:
- 預生成測試用例。需要理解對象規約支持的數據結構和可接受的范圍,然后對應生成測試邊界條件或者是違反規約的測試用例。生成測試用例很費神,但是可以復用。用完用例,測試結束。
- 隨機生成輸入。效率最低,但是可以快速識別目標是否有非常糟糕的代碼。
- 手工協議變異測試。比隨機生成更加初級。優點是可充分發揮自己過去的經驗和“直覺”。常用于Web應用安全測試。
- 變異或強制性測試。模糊器從一個有效的協議樣本或是數據格式樣本開始,持續不斷地打亂數據包或是文件中的每一個字節、字、雙字或是字符串。雖然該方法浪費了CPU資源,但是不需要對應用進行研究,并且整個模糊測試過程可以完全自動化。
- 自動協議生成測試。需要先對應用進行研究,理解和解釋協議規約或文件定義。但是這種方法并不基于協議規約或文件定義創建硬編碼的測試用例,而是創建一個描述協議規約如何工作的文法。例如,SPIKE和SPIKEfile工具都是這類測試的典型例子,采用SPIKE腳本描述協議或是文件格式,并使用一個模糊測試引擎來創建輸入數據。
2. 模糊測試的過程
模糊測試可以分為6個基本階段,如圖所示:
2.1 確定測試目標
- 不同的測試目標使用的模糊測試技術和方法也不一樣。需要考慮對內部開發的應用程序還是對第三方應用程序進行模糊測試。還必須選擇應用程序中的具體的目標文件或庫,尤其是選擇那些被多個應用程序共享的庫,因為這些庫的用戶群體比較大,出現安全漏洞的風險也相應較高。
- 在此過程中,針對被測試程序,在一些典型的漏洞信息網站(如SecurityFocus、Secunia、CNVD等),查找軟件開發商歷史上曾出現的安全漏洞,分析這些漏洞的形成原因及編碼習慣,有針對性地選擇相應的模糊測試工具和方法。
2.2 確定預期輸入
- 模糊測試是一個不斷枚舉輸入向量的過程,任何從客戶端發往目標應用程序的輸入都應該作為輸入向量,比如一個http請求,包括請求頭、url以及發送的參數等,其他輸入向量還有文件名、環境變量以及注冊表鍵值等。
- 對不同的軟件,可以選擇性地側重某些輸入向量,但是一個完整的模糊測試過程應該進行充分、完全的測試。
- 例如,對tcp協議處理軟件進行模糊測試,不僅要對數據部分進行測試,序號、確認號、數據偏移字段、標志位、保留字段、窗口以及校驗和等部分也應該被納入模糊測試的范圍。
2.3 生成模糊測試用例
- 確定待測試目標和輸入向量后,應該根據不同的輸入向量選擇不同的模糊器來生成模糊測試用例。由于數據量較大,這個階段通常會采用自動化方式完成。
- 模糊器常用的生成測試數據的方法如下:
- 基于生成的方法,在對目標軟件輸入數據格式的規約有深刻了解的基礎上,自動生成一些不滿足數據規約的測試樣本。
- 基于變異的生成方法,從一個合法的樣本出發,通過某些算法不斷地修改其中一些數據,生成一批畸形的測試用例。
- 生成和變異相結合的方法。
2.4 執行模糊測試用例
- 執行模糊測試用例就是將上一階段生成的大量模糊測試數據不斷發送給待測試目標程序。面對大量的模糊測試數據,同樣需要使用自動化工具來完成。
2.5 監視異常
- 監視異??梢园l現程序哪里發生故障,并根據監視信息進一步分析為什么會產生故障。由于模糊測試過程比較長,當測試用例的數目較多時,常常需要采用自動化的方式實現。
- 當前常用的異常監視技術依據原理分為兩種:
- 基于調試的方法。在調試模式下啟動目標軟件,通過操作系統平臺提供的調試API,開發有針對性的異常檢測模塊。此方法實現異常監視雖然難度較大,但更加高效。
- 基于插樁的方法。在模糊測試過程中,僅僅通過觀察程序的輸入、輸出,對了解軟件內部的運行信息往往是不夠的。例如軟件運行過程中內部變量的狀態信息、模塊之間的交互信息等,這些信息對于發現漏洞及定位漏洞來說特別重要?;诓鍢兜姆椒ň褪窃诒WC被測試程序原有邏輯完整的基礎上,在程序中插入一些探針(又稱為“探測儀”,本質上是進行信息采集的代碼段,可以是賦值語句或采集覆蓋信息的函數調用),通過探針的執行并拋出程序運行的特征數據,通過對這些數據的分析,可以獲得程序的控制流和數據流信息,進而得到邏輯覆蓋等動態信息,從而實現測試目的的方法。目前常用的插樁方法分為源代碼插樁、靜態代碼插樁和二進制代碼插樁等。
- 源代碼插樁(Source Code Instrumentation)。這是一種最自然的方式,即在編寫軟件時,在需要監視的地方插入檢測代碼,如增加輸出信息語句、增加日志語句等,尤其是面向切面編程技術(Aspect Oriented Programming)可以較好地用于源代碼插樁,有效分離業務邏輯與監測邏輯。
- 靜態代碼插樁。例如在Java中,字節碼插樁可以直接更改中間代碼文件(如Java的.class文件等)或在類被類加載器(Class Loader)裝載時進行字節碼插樁。字節碼插樁擁有執行效率高、插樁點靈活等優點,使其在面向切面編程領域大放光彩,并陸續出現了BCEL、Javassit和ASM等工具。
- 基于二進制的插樁。該技術可以進一步提高模糊測試的異常檢測能力,但是其系統消耗較大,且大部分為商業插樁軟件。常用的二進制插樁工具有DynamoRIO、Dyninst和Pin等。
2.6 異常分析并確認漏洞
- 異常分析并確認漏洞是模糊測試過程中的最后一步,主要分析目標軟件產生異常的位置與引發異常的原因。常用的分析方法是借助于IDA Pro、OllDbg和SoftICE等二進制分析工具進行人工分析。
實驗流程
1. 安裝AFL
- 下載AFL源代碼wget https://lcamtuf.coredump.cx/afl/releases/afl-latest.tgz tar -zxvf afl-latest.tgz cd afl-2.52b
- 安裝gcc編譯器
- 原本打算通過安裝llvm與clang進行編譯,不過在之后執行sudo make install的時候報錯"Oops, the instrumentation does not seem to be behaving correctly...",經查可能是llvm版本問題,故改為gcc編譯。
- make并展示指令列表,確認安裝成功make
sudo make install
alf-fuzz
2. 安裝漏洞語料庫、目標C程序
- 安裝漏洞語料庫mkdir testcase cd testcase wget http://samples.ffmpeg.org/tests/DivX-test/Xmen-OpenDivX-200-slow.avi cd ..
- 確定目標C程序:選擇的目標C程序是off-the-shelf C程序ultrix42-deroff.c,其內容存在于testfile.c內
3. 開始測試
-
對代碼進行編譯
afl-gcc -g -o afl_test testfile.c -
開始fuzzing程序
- 原本使用的指令為afl-fuzz -i testcase -o output . /afl test,報錯內容為
- 修改配置,執行以下指令,結果如圖sudo su root echo ecore > /proc/sys/kernel/core_pattern exit
- 此問題解決之后再次報錯顯示內存的50M限制被占滿,該用以下指令解決該問題。afl-fuzz -i testcase -o output ./afl_test sam2p @@
- 原本使用的指令為afl-fuzz -i testcase -o output . /afl test,報錯內容為
-
fuzzing時的面板
-
結束后的面板
參考內容
總結
以上是生活随笔為你收集整理的[课业] | 软件安全 | 使用American Fuzzy Lop工具挖掘C/C++程序漏洞的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 销售管理系统(c++)简单易解
- 下一篇: 怎么下载淘宝主的视频