work节点使用外部包_AFLSmart工具简单分析及使用介绍
AFLSmart 是一個在 AFL 基礎(chǔ)上,結(jié)合了 Peach 的結(jié)構(gòu)化輸入組件的灰盒 smart fuzz 工具。
AFLSmart 鏈接:https://github.com/aflsmart/aflsmart
參考資料:《Smart Greybox Fuzzing》
什么是 AFLSmart
灰盒 smart fuzz
灰盒測試是基于程序運(yùn)行時刻的外部表現(xiàn)同時又結(jié)合程序內(nèi)部邏輯結(jié)構(gòu)來設(shè)計(jì)用例,執(zhí)行程序并采集程序路徑執(zhí)行信息和外部用戶接口結(jié)果的測試技術(shù)。
具有結(jié)果反饋功能的模糊測試即屬于灰盒 fuzz,如 AFL,會對待測程序進(jìn)行插裝,從而監(jiān)控每個輸入的路徑覆蓋率,為下一次選擇輸入文件進(jìn)行變異提供依據(jù)。
smart fuzz 是面向具有高度結(jié)構(gòu)化輸入(如,PPT,mp3,PDF 等)的程序進(jìn)行測試的一類模糊測試工具,典型的 smart fuzz 工具如 Peach。使用 Peach 的關(guān)鍵在于名為「Peach Pit」的 xml 配置文件。「Peach Pit」主要包含了文件的數(shù)據(jù)信息。
AFLSmart
AFLSmart 在 AFL 的基礎(chǔ)上,參照了 Peach 的 File Cracker 組件,將文件按 chunk 劃分,抽象為一個可以用 xml 文件描述的樹形的結(jié)構(gòu),如下圖為一個 wav 格式的文件抽象為 xml 文件的表示:
針對結(jié)構(gòu)化的輸入,AFL 提供了基于字典的方法進(jìn)行解決,然而該方法的缺陷在于,在變異的時候,仍然處于 bit 級別的變異,AFL 無法對一個文件塊進(jìn)行增加和刪除操作。? ?
AFLSmart 源碼中,對 chunk 結(jié)構(gòu)的定義如下:
struct chunk {unsigned long
id; /* The id of the chunk, which either equals its pointer value or, when
loaded from chunks file, equals to the hashcode of its chunk
identifer string casted to unsigned long. */
int type; /* The hashcode of the chunk type. */
int start_byte; /* The start byte, negative if unknown. */
int end_byte; /* The last byte, negative if unknown. */
char modifiable; /* The modifiable flag. */
struct chunk *next; /* The next sibling child. */
struct chunk *children; /* The children chunks linked list. */
};
一個 chunk 結(jié)構(gòu)里定義了 chunk 的類型、開始位置、結(jié)束位置、表示是否被修改的標(biāo)志位、以及 chunk 的子節(jié)點(diǎn)和 next 節(jié)點(diǎn)。
在 AFL 的 bit 級別的變異的基礎(chǔ)上,AFLSmart 增加了對 chunk 級別的變異操作,主要包括三種操作:
smart deletion:
在這種方法中,會對給定的種子文件,隨機(jī)選取 chunk 進(jìn)行刪除。
smart addition:
在這種方法中,給定一個種子文件 S1,隨機(jī)選取一個種子文件 S2,在 S2 中隨機(jī)選取一個 chunk C2,將 C2 插入到 S1 中和 C2 具有相同父節(jié)點(diǎn)的 chunk C1 的后面(C1.parent.type ==C2.parent.type)? ?
smart splicing:
這種方法中,對于給定的種子文件 S1,隨機(jī)選取 chunk C1,隨機(jī)選取種子文件 S2,找到 S2 中與 C1 類型相同的 chunk C2,將 C2 替換到 C1 的位置上。? ?
AFLSmart 的安裝
1. 安裝 automake 及一些其他的包
sudo apt-get install build-essential automake libtool libc6-dev-i386 python-pip g++-multilib2. 安裝 mono 包,為了在 Linux 上支持 C#
sudo apt-get install mono-complete3. 安裝 gcc-4.4 以及 g++-4.4,(Peach 中的 Pin 組件在更高的 gcc 版本中會發(fā)生一些編譯問題)? ?
sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt-get update sudo apt install gcc-4.4 sudo apt install g++-4.4如成功,則直接看第四步,如不能成功,可嘗試以下命令
sudo gedit /etc/apt/sources.list向文件中添加如下內(nèi)容:? ??
deb http://dk.archive.ubuntu.com/ubuntu/ trusty main universe然后安裝
sudo apt-get update sudo apt install gcc-4.4 sudo apt install g++-4.44. 環(huán)境成功準(zhǔn)備好后,開始 AFLSmart 的安裝
git clone https://github.com/aflsmart/aflsmart cd aflsmart make clean all cd .. export AFLSMART=$(pwd)/aflsmart export WORKDIR=$(pwd)5. 修改 Peach 的版本
cd $AFLSMART wget https://sourceforge.net/projects/peachfuzz/files/Peach/3.0/peach-3.0.202-source.zip unzip peach-3.0.202-source.zip patch -p1 < peach-3.0.202.patch cd peach-3.0.202-source CC=gcc-4.4 CXX=g++-4.4 ./waf configure CC=gcc-4.4 CXX=g++-4.4 ./waf install6. 設(shè)置 PATH 的環(huán)境變量
export PATH=$PATH:$AFLSMART:$AFLSMART/peach-3.0.202-source/output/linux_x86_64_debug/bin export AFL_PATH=$AFLSMART export LD_LIBRARY_PATH=/usr/local/lib7. 進(jìn)入到 AFLSmart 目錄,輸入
./afl-fuzz出現(xiàn)如下界面,說明安裝成功。
AFLSmart 的使用
熟悉 AFL 的朋友,對于 AFLSmart 的使用應(yīng)該不會太陌生,AFlSmart 的使用方法與 AFL 基本一致。這里還是以 tcpdump 為例,對 AFLSmart 的使用進(jìn)行一個簡單的介紹。
測試 tcpdump 之前,首先應(yīng)該下載 tcpdump 源碼包,下載地址:http://www.tcpdump.org/,在這個地址,下載 tcpdump 包與 libpcap 包。
下載 tcpdump 的一些其他依賴包:下載 bison 包,下載地址:ftp.gnu.org/gnu/bison,? ?下載 m4 包,下載地址:ftp.gnu.org/gnu/m4/。
1. 安裝 libpcap:
tar -zxvf libpcap-1.3.0.tar.gz? cd libpcap-1.3.0 ./configure make? make install2. 輸入命令,安裝 flex
sudo apt-get install flex3.bison 與 m4 包的安裝步驟與 libpcap 的相同,參照上述命令即可。
4. 使用 afl-gcc 對 tcpdump 進(jìn)行編譯,afl-gcc 會在對 tcpdump 進(jìn)行編譯時,對 tcpdump 進(jìn)行插樁,從而方便監(jiān)控用例的路徑覆蓋情況。命令如下:
tar -zxvf tcpdump-4.3.0.tar.gz? cd tcpdump-4.3.0 CC=./aflsmart 安裝目錄/afl-gcc ./configure make clean all make install編譯過程中,出現(xiàn)如下界面,說明使用 afl-gcc 對 tcpdump 進(jìn)行編譯成功。
tcpdump 的命令格式如下:
tcpdump [ -adeflnNOpqRStuvxX ] [ -c 數(shù)量 ] [ -C 文檔尺寸 ] [ -F 文檔名 ] [ -i 網(wǎng)絡(luò)接口 ] [ -m 文檔名 ] [ -r 文檔名 ] [ -s 長度 ] [ -T 類型 ] [ -w 文檔名 ] [ -E algo:secret ] [ 表達(dá)式 ]?
tcpdump 常用命令行選項(xiàng):
-a 將網(wǎng)絡(luò)地址和廣播地址轉(zhuǎn)變成容易識別的名字?
-d 將已截獲的數(shù)據(jù)包的代碼以人容易理解的格式輸出;?
-dd 將已截獲的數(shù)據(jù)包的代碼以 C 程式的格式輸出;?
-ddd 將已截獲的數(shù)據(jù)包的代碼以十進(jìn)制格式輸出;?
-e 輸出數(shù)據(jù)鏈路層的頭部信息;?
-f 將 internet 地址以數(shù)字形式輸出;?
-l 將標(biāo)準(zhǔn)輸出變?yōu)樾芯彌_方式;?
-n 不將網(wǎng)絡(luò)地址轉(zhuǎn)換成易識別的主機(jī)名,只以數(shù)字形式列出主機(jī)地址 (如 IP 地址),這樣能夠避免 DNS 查詢;?
-t 不輸出時間戳;?
-v 輸出較周詳?shù)男畔?#xff0c;例如 IP 包中的 TTL 和服務(wù)類型信息;?
-vv 輸出詳盡的報(bào)文信息;?
-c 在捕獲指定個數(shù)的數(shù)據(jù)包后退出;?
-F 從指定的文檔中讀取過濾規(guī)則,忽略命令行中指定的其他過濾規(guī)則;?
-i 指定監(jiān)聽的網(wǎng)絡(luò)接口;?
-r 從指定的文檔中讀取數(shù)據(jù)包 (該文檔一般通過-w 選項(xiàng)產(chǎn)生);?
-w 將截獲的數(shù)據(jù)包直接寫入指定的文檔中,不對其進(jìn)行分析和輸出;?
-T 將截獲的數(shù)據(jù)包直接解釋為指定類型的報(bào)文,現(xiàn)在支持的類型有 cnfp、rpc、rtp、snmp、vat 和 wb。
接下來,我們將使用 AFLsmart 對 tcpdump 的 -nr 功能進(jìn)行測試,該參數(shù)的作用是從指定的文檔中讀取數(shù)據(jù)包。
6. 收集測試用例。我們需要 pcap 格式的輸入,對 tcpdump 的-nr 功能進(jìn)行測試。在 tcpdump 源碼包中有一個 tests 文件夾,包含了許多我們測試所需的 pcap 文件。這里,我們直接使用這些 pcap 文件進(jìn)行測試。
新建一個 tcpdumptest 文件夾,方便測試。將 testes 文件夾復(fù)制過來,只保留 pcap 的數(shù)據(jù)。
cd tcpdumptestmkdir incd testscp *.pcap ../incd ..rm -f testsAFL 中還有一些對數(shù)據(jù)進(jìn)行處理的工具,可以對輸入數(shù)據(jù)進(jìn)行覆蓋率分析等,壓縮輸入文件的大小,從而提高測試的效率。如 afl-tmin、afl-cmin。網(wǎng)上已有許多介紹 AFL 的文章了,這里對這些工具就不重復(fù)介紹了。
你可以使用這些工具對 pcap 包進(jìn)行一個處理,也可以不處理,直接使用它們進(jìn)行測試。
7. 測試 tcpdump
輸入命令:
cd aflsmart ./afl-fuzz -i ../testaflsmart/tcpdump/in/ -o ../testaflsmart/tcpdump/out/ tcpdump -nr @@可能會出現(xiàn)如下界面:
按照圖片提示,進(jìn)入 root 用戶模式,輸入命令即可。
最終運(yùn)行界面如下圖所示:
AFLSmart 的測試
在 smart greybox fuzz 文中提到,他們使用 AFLSmart 與 AFL、Peach、AFLfast 對幾種具有結(jié)構(gòu)化輸入的程序進(jìn)行測試,結(jié)果如下如所示:
由上圖可以看出,AFLSmart 在測試 AVI、WAV、JPEG2000 這三種格式時,與其他三種工具相比,優(yōu)勢明顯。
*本文作者:紅玫瑰與黑玫瑰,轉(zhuǎn)載請注明來自FreeBuf.COM
總結(jié)
以上是生活随笔為你收集整理的work节点使用外部包_AFLSmart工具简单分析及使用介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html转word 图片丢失 java_
- 下一篇: 达内培训c语言,【达内C 培训教程】C