6. Fuzzing101 - 6 GIMP
1. 目標(biāo)環(huán)境配置
本次的目標(biāo)程序是一個(gè)帶有GUI的可交互的程序,在構(gòu)建編譯上會(huì)比之前的軟件稍微有一丟丟復(fù)雜。
首先要安裝gimp會(huì)使用到的 GEGL 0.2(Generic Graphics Library),嘗試使用源碼編譯:
# install dependenciessudo apt install build-essential libatk1.0-dev libfontconfig1-dev libcairo2-dev libgudev-1.0-0 libdbus-1-dev libdbus-glib-1-dev libexif-dev libxfixes-dev libgtk2.0-dev python2.7-dev libpango1.0-dev libglib2.0-dev zlib1g-dev intltool libbabl-dev# download and uncompresswget https://download.gimp.org/pub/gegl/0.2/gegl-0.2.0.tar.bz2tar xvf gegl-0.2.0.tar.bz2 && cd gegl-0.2.0# modify the source codesed -i 's/CODEC_CAP_TRUNCATED/AV_CODEC_CAP_TRUNCATED/g' ./operations/external/ff-load.csed -i 's/CODEC_FLAG_TRUNCATED/AV_CODEC_FLAG_TRUNCATED/g' ./operations/external/ff-load.c# build and install./configure --enable-debug --disable-glibtest --without-vala --without-cairo --without-pango --without-pangocairo --without-gdk-pixbuf --without-lensfun --without-libjpeg --without-libpng --without-librsvg --without-openexr --without-sdl --without-libopenraw --without-jasper --without-graphviz --without-lua --without-libavformat --without-libv4l --without-libspiro --without-exiv2 --without-umfpackmake -j$(nproc)sudo make install
這里對(duì)于 GEGL 這個(gè)圖形庫(kù)的編譯安裝我們不做過(guò)多介紹,這不是我們的重點(diǎn),可以明確告知的是上面的庫(kù)在編譯時(shí)大概率會(huì)編譯報(bào)錯(cuò),導(dǎo)致一些庫(kù)文件編譯失敗。所以,對(duì)于Ubuntu 20.04以上版本(我使用的是22.04)可以直接 sudo apt install libgegl-0.4-0來(lái)安裝這個(gè)0.4版本的庫(kù)。(盡量不在非fuzz階段浪費(fèi)時(shí)間)
然后,下載 GIMP 2.8.16,并進(jìn)行編譯安裝:
# download cd ..wget https://mirror.klaus-uwe.me/gimp/pub/gimp/v2.8/gimp-2.8.16.tar.bz2tar xvf gimp-2.8.16.tar.bz2 && cd gimp-2.8.16/# build and installCC=afl-clang-lto CXX=afl-clang-lto++ PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig CFLAGS="-fsanitize=address" CXXFLAGS="-fsanitize=address" LDFLAGS="-fsanitize=address" ./configure --disable-gtktest --disable-glibtest --disable-alsatest --disable-nls --without-libtiff --without-libjpeg --without-bzip2 --without-gs --without-libpng --without-libmng --without-libexif --without-aa --without-libxpm --without-webkit --without-librsvg --without-print --without-poppler --without-cairo-pdf --without-gvfs --without-libcurl --without-wmf --without-libjasper --without-alsa --without-gudev --disable-python --enable-gimp-console --without-mac-twain --without-script-fu --without-gudev --without-dbus --disable-mp --without-linux-input --without-xvfb-run --with-gif-compression=none --without-xmc --with-shm=none --enable-debug --prefix="$HOME/Desktop/Fuzz/training/fuzzing_gimp/gimp-2.8.16/install"AFL_USE_ASAN=1 make -j$(nproc)AFL_USE_ASAN=1 make install
這里的編譯選項(xiàng)有點(diǎn)多,第一次的時(shí)候盡可能保持一致,避免出錯(cuò),如果要進(jìn)行優(yōu)化和改進(jìn),可根據(jù)實(shí)際需求來(lái)增刪編譯選項(xiàng)。
編譯完成后檢查軟件是否可以正常運(yùn)行,命令行和圖形界面都檢查一下。
2. AFL++編譯target
1. Persistent Mode
Persistent Mode 是 AFL 提供的一種可以加快fuzz 執(zhí)行速度的功能,詳細(xì)原理我們?cè)谠创a解析的文章中已經(jīng)進(jìn)行了深入的介紹,這里大家只需要簡(jiǎn)單理解成無(wú)需每次都進(jìn)行 fork 操作,而只是在程序的某一特定位置進(jìn)行循環(huán) fuzz。
2. 修改源碼
我們需要在源碼中找合適的位置插入 persistent mode 的執(zhí)行代碼,對(duì)于本例而言,有兩處可以插入。第一處是 app.c 文件:
第二處是 xcf.c 文件:
至于為什么選擇這兩個(gè)地方進(jìn)行 fuzz ,就看大家對(duì)軟件流程和功能的理解程度了。
我們這里執(zhí)行時(shí),兩種方案都測(cè)試一下。第二種方案,通過(guò)打補(bǔ)丁的方式來(lái)修改源碼,補(bǔ)丁如下:
--- ../xcf.c 2014-08-20 08:27:58.000000000 -0700+++ ./app/xcf/xcf.c 2021-10-11 13:02:42.800831192 -0700@@ -277,6 +277,10 @@ filename = g_value_get_string (&args->values[1]);+#ifdef __AFL_COMPILER+ while(__AFL_LOOP(10000)){+#endif+ info.fp = g_fopen (filename, "rb"); if (info.fp)@@ -366,6 +370,12 @@ if (success) gimp_value_set_image (&return_vals->values[1], image);+#ifdef __AFL_COMPILER+ }+#endif++ exit(0);+ gimp_unset_busy (gimp); return return_vals;
需要注意的是,最后的 exit(0);一定要有,否在程序會(huì)在 console 模式下卡住,導(dǎo)致 fuzz 的 test 都超時(shí)。
進(jìn)行patch:
patch gimp-2.8.16/app/xcf/xcf.c -i persistent.patch
3. 執(zhí)行fuzz
測(cè)試用例我們用一個(gè)最簡(jiǎn)單的:
mkdir afl_in && cd afl_inwget https://github.com/antonio-morales/Fuzzing101/blob/main/Exercise%206/SampleInput.xcf
這里還要注意,刪除掉 gimp 的插件,這些插件可能會(huì)導(dǎo)致 gimp 運(yùn)行失?。?/p>
rm ./install/lib/gimp/2.0/plug-ins/*
最后開(kāi)啟 fuzz:
ASAN_OPTIONS=detect_leaks=0,abort_on_error=1,symbolize=0 afl-fuzz -i './afl_in' -o './afl_out' -D -t 200 -M master -- ./gimp-2.8.16/install/bin/gimp-console-2.8 --verbose -d -f @@ASAN_OPTIONS=detect_leaks=0,abort_on_error=1,symbolize=0 afl-fuzz -i './afl_in' -o './afl_out' -D -t 200 -S slave1 -- ./gimp-2.8.16/install/bin/gimp-console-2.8 --verbose -d -f @@
審核編輯:湯梓紅
-
Target
+關(guān)注
關(guān)注
0文章
13瀏覽量
8483 -
編譯
+關(guān)注
關(guān)注
0文章
659瀏覽量
32900 -
Fuzzing
+關(guān)注
關(guān)注
0文章
4瀏覽量
7276 -
GUI
+關(guān)注
關(guān)注
3文章
662瀏覽量
39754
原文標(biāo)題:【技術(shù)干貨】Fuzzing101全實(shí)踐 -- (三)
文章出處:【微信號(hào):IOTsec Zone,微信公眾號(hào):IOTsec Zone】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論