【AFL(二)】AFL 工具分析 afl-cmin、afl-tmin


師兄給了第二次任務之后,因為一些奇奇怪怪的原因擱置了,現在終於想起來重新拾起來了。本文主要是對兩個工具的分析:掌握AFL界面的所顯示的全部信息【代表什么意思大概了解一下】。使用afl-cmin 和 afl-tmin的功能 做出一個使用指令前后對比圖。(真實的fuzz環境中,測試用例是很多的,怎么去精簡化,多樣化篩選是很重要的)


afl-cmin part

docsREADME中是這樣描述cmin tool的:

Before using this corpus for any other purposes, you can shrink it to a smaller size using the afl-cmin tool. The tool will find a smaller subset of files offering equivalent edge coverage.

大概意思就是:cmin工具可以減小corpus的大小,這個工具可以得到一個更小的子集(原case集合的子集),這個子集可以提供同樣的edge coverage效果。

舉個例子就更明確了,接着上一篇的例子繼續:

第一步、語料庫,里面有很多case,但實際上有些可以精簡,如圖是我創建的簡單的很多用例,其實就是上一次的多copy一些,改改字母,也就是說這些用例其實都差不多,需要刪減;

第二步、查看afl-cmin的操作指南

根據usage的提示,輸入的命令形式應該是:

//afl-cmin -i 測試用例文件夾 -o 篩選后的測試用例文件夾 [可能會用到其他操作] 測試程序文件
//這里的用法如下
afl-cmin -i fuzz_in -o fuzz_in_cmin ./afl_test

第三步、篩選結果,顯示如圖:

最后篩選結果是只有一個文件,最后一個文件,推測是每次用一個文件跟之前的比較,如果能達到上一個的效果,就替換掉上一個文件。(測試后,確實如此,回頭看看源代碼是不是這樣,挖坑,【11.21補坑,跟師兄求證之后,發現確實如此】

 

到這里就很明顯了,afl-cmin tool是為了刪減,把多個用例組成的集合,刪減成具有同等效果的子集。


afl-tmin part

官方docs的READMEtmin tool的描述如下

Oh, one more thing: for test case minimization, give afl-tmin a try. The toolcan be operated in a very simple way:
$ ./afl-tmin -i test_case -o minimized_result -- /path/to/program [...]
The tool works with crashing and non-crashing test cases alike. In the crash mode, it will happily accept instrumented and non-instrumented binaries. In the non-crashing mode, the minimizer relies on standard AFL instrumentation to make the file simpler without altering the execution path.

 按照描述,大概意思是:工具是為了創造一個更小的文件,同時又能達到同樣的效果。當然操作也會比cmin簡單。

第一步、還是語料庫,當然因為是對單個文件處理,所以這里我是用的crash文件進行的修改【不過這里有個問題最后會說一下】

第二步、查看afl-tmin工具的用法

第三步、進行處理,可以看到命令很簡單,必需的就是輸入輸出和測試程序

//afl-tmin -i 需要精簡的文件 -o 精簡后的文件 [其他操作] 測試程序
//這里用到的用例
afl-tmin -i fuzz_in/testcase_bin -o fuzz_in_tmin/testcase_tmin ./afl_test

可以看到結果如下圖:

經過tmin之后的文件對比

第四步、這里遇到一個問題,這是用的crash進行的測試,但是當我用最早的testcase進行tmin的時候,會發現報錯:[!] WARNING: Down to zero bytes - check the command line and mem limit!【已補坑,見最后一部分】

這里就很迷,具體情況如圖,暫時還沒解決為什么,挖坑待之后解決。


【補坑】

這里對tmin的新理解整理:tmin就是把我們提供的文件放到afl編譯出來的程序里跑,然后再按一定方式進行精簡【精簡的原理感覺還是得看看源碼才能更好的理解】。

那么之前為啥 down to zero 呢,估計是自己寫的case太垃圾,tmin覺得都沒用:“什么垃圾case,刪掉刪掉”,所以就全刪沒了,怎么印證這一觀點呢?

【1】把引起crash的bin文件用gedit打開,然后直接copy到我之前那個testcase。

引起crash的文件打開:

復制到testcase:

【2】重新tmin testcase,發現可以了,雖然最后精簡完成了一字節,但是成功了呀。

綜上,tmin的 -i 文件不是一定要binary文件;testcase太垃圾是會被tmin全部干掉的;testcase可以是亂文件,不一定跟crash有關系,因為我之后在testcase隨機加東西,都會成功tmin;


Refrenece參考資料

afl-cmin tool:http://www.tin.org/bin/man.cgi?section=1&topic=AFL-CMIN

afl-tmin tool:http://www.tin.org/bin/man.cgi?section=1&topic=afl-tmin

afl使用指南:https://www.codercto.com/a/78143.html

afl詳細分析:https://blog.csdn.net/Chen_zju/article/details/80791268


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM