
टेम्पलेट-संचालित बाइनरी फॉर्मेट फज़र जो तेज गति से वैध टेस्ट इनपुट उत्पन्न और पार्स करता है, कवरेज-निर्देशित फज़िंग के लिए AFL++ एकीकरण के साथ।
FormatFuzzer एक फ्रेमवर्क है जो उच्च दक्षता, उच्च गुणवत्ता वाले बाइनरी इनपुटों के निर्माण और पार्सिंग के लिए है।
यह एक बाइनरी टेम्पलेट लेता है जो बाइनरी इनपुट के प्रारूप का वर्णन करता है और एक निष्पादनीय उत्पन्न करता है जो दिए गए बाइनरी प्रारूप का उत्पादन और पार्स करता है।
उदाहरण के लिए, GIF के लिए एक बाइनरी टेम्पलेट से, FormatFuzzer एक GIF जनरेटर उत्पन्न करता है - जिसे GIF फ़ज़र भी कहा जाता है।
FormatFuzzer द्वारा उत्पादित जनरेटर अत्यधिक कुशल होते हैं, प्रति सेकंड हजारों मान्य परीक्षण इनपुट उत्पन्न करते हैं - उत्परिवर्तन-आधारित फ़ज़रों के बिल्कुल विपरीत, जहाँ अधिकांश इनपुट अमान्य होते हैं। FormatFuzzer द्वारा उत्पन्न इनपुट परीक्षण के अंतर्गत प्रोग्राम से स्वतंत्र होते हैं (या वास्तव में, किसी भी प्रोग्राम से), इसलिए आप उनका उपयोग ब्लैक-बॉक्स सेटिंग्स में भी कर सकते हैं। हालाँकि, FormatFuzzer अधिकतम कवरेज के लिए लक्ष्य रखने वाले मान्य इनपुट उत्पन्न करने के लिए AFL++ के साथ भी एकीकृत होता है। हमारे प्रयोगों में, यह "दो दुनियाओं का सर्वश्रेष्ठ" दृष्टिकोण अन्य सभी सेटिंग्स से आगे निकल जाता है; विवरण के लिए हमारा शोधपत्र देखें।
FormatFuzzer द्वारा उपयोग किए जाने वाले बाइनरी टेम्पलेट 010 संपादक से आते हैं।
170 से अधिक बाइनरी टेम्पलेट हैं, जिनका उपयोग सीधे FormatFuzzer के लिए किया जा सकता है या इसके उपयोग के लिए अनुकूलित किया जा सकता है। बॉक्स के बाहर, FormatFuzzer AVI, BMP, GIF, JPG, MIDI, MP3, MP4, PCAP, PNG, WAV और ZIP जैसे प्रारूप उत्पन्न करता है; और हम हर सप्ताह इस सूची का विस्तार करते रहते हैं।
योगदानकर्ताओं का स्वागत है! विचारों और मुद्दों को दर्ज करने या पुल रिक्वेस्ट जोड़ने के लिए FormatFuzzer प्रोजेक्ट पेज पर जाएँ। FormatFuzzer कैसे काम करता है और इसकी तुलना कैसे होती है, इसके विवरण के लिए हमारा शोधपत्र पढ़ें।
FormatFuzzer FormatFuzzer प्रोजेक्ट पेज से उपलब्ध है। आप रिलीज़ पेज से नवीनतम रिलीज़ डाउनलोड और अनपैक कर सकते हैं।
नवीनतम और सर्वश्रेष्ठ के लिए, आप इसका git रिपॉजिटरी क्लोन भी कर सकते हैं:
git clone https://github.com/uds-se/FormatFuzzer.git
सभी आगे की कार्रवाइयाँ इसके मुख्य फ़ोल्डर में होती हैं:
cd FormatFuzzer
FormatFuzzer चलाने के लिए, आपको निम्नलिखित की आवश्यकता है:
getopt_long()) के साथ एक C++ कंपाइलर जैसे clang या gccpy010parser, six, और intervaltreezlib लाइब्रेरी (संपीड़न कार्यों के लिए)boost लाइब्रेरी (चेकसम कार्यों के लिए)यदि आप बिल्ड और कॉन्फ़िगरेशन स्क्रिप्ट (.ac और .am फ़ाइलें) संपादित करने की योजना बनाते हैं, तो आपको इसकी भी आवश्यकता होगी:
sudo apt install git g++ make automake python3-full zlib1g-dev libboost-dev
python3 -m venv ~/fuzz
source ~/fuzz/bin/activate
pip3 install py010parser six intervaltree
xcode-select --install
brew install python3 automake boost
pip3 install py010parser six intervaltree
सभी सिस्टम पर, pip का उपयोग करके:
pip install py010parser
pip install six
pip install intervaltree
नोट: सभी बिल्ड कमांड के लिए आपको इस README फ़ाइल वाले फ़ोल्डर में होना आवश्यक है। इस फ़ोल्डर के बाहर फ़ज़र बनाना अभी तक समर्थित नहीं है।
एक build.sh स्क्रिप्ट है जो सभी निर्माण चरणों को स्वचालित करती है।
बस चलाएँ:
./build.sh gif
एक GIF फ़ज़र बनाने के लिए।
यह templates/ में प्रदान किए गए सभी फ़ाइल प्रारूपों के लिए काम करता है; यदि कोई फ़ाइल templates/FOO.bt है, तो ./build.sh FOO एक फ़ज़र बनाएगा।
एक Makefile (स्रोत Makefile.am में) है जो सभी निर्माण चरणों को स्वचालित करता है।
(GNU make आवश्यक है।)
पहले करें:
touch configure Makefile.in
फिर:
./configure
और फिर:
make gif-fuzzer
एक GIF फ़ज़र बनाने के लिए।
यह templates/ में प्रदान किए गए सभी फ़ाइल प्रारूपों के लिए काम करता है; यदि कोई फ़ाइल templates/FOO.bt है, तो make FOO-fuzzer एक फ़ज़र बनाएगा।
यदि उपरोक्त make विधि काम नहीं करती है, या यदि आप अधिक नियंत्रण चाहते हैं, तो आपको मैन्युअल रूप से आगे बढ़ना पड़ सकता है।
बाइनरी टेम्पलेट को C++ कोड में संकलित करने के लिए ffcompile कंपाइलर चलाएँ। यह दो तर्क लेता है: .bt बाइनरी टेम्पलेट, और एक .cpp C++ फ़ाइल जो उत्पन्न होनी है।
./ffcompile templates/gif.bt gif.cpp
एक फ़ज़र gif-fuzzer बनाने के लिए निम्नलिखित कमांड का उपयोग करें।
पहले, सामान्य कमांड-लाइन ड्राइवर संकलित करें:
g++ -c -I . -std=c++17 -g -O3 -Wall fuzzer.cpp
(-I . bt.h फ़ाइल का स्थान दर्शाता है; -std=c++17 C++ मानक सेट करता है।)
फिर, बाइनरी पार्सर/कंपाइलर संकलित करें:
g++ -c -I . -std=c++17 -g -O3 -Wall gif.cpp
अंत में, बाइनरी पार्सर/कंपाइलर को कमांड-लाइन ड्राइवर से लिंक करके एक निष्पादनीय प्राप्त करें। यदि आप किसी अतिरिक्त लाइब्रेरी (जैसे -lz) का उपयोग करते हैं, तो उन्हें यहाँ भी निर्दिष्ट करना सुनिश्चित करें।
g++ -O3 gif.o fuzzer.o -o gif-fuzzer -lz
FormatFuzzer को एक स्टैंडअलोन पार्सर, जनरेटर या विशिष्ट प्रारूपों के म्यूटेटर के रूप में चलाया जा सकता है। इसके अतिरिक्त, इसे सामान्य-उद्देश्यीय फ़ज़र जैसे AFL++ द्वारा बुलाया जा सकता है ताकि उन प्रारूप-विशिष्ट क्षमताओं को फ़ज़िंग प्रक्रिया में एकीकृत किया जा सके (AFL++ एकीकरण पर नीचे अनुभाग देखें)।
उत्पन्न फ़ज़र पहले तर्क के रूप में एक कमांड लेता है, उसके बाद उस कमांड के विकल्प और तर्क होते हैं।
सबसे महत्वपूर्ण कमांड fuzz है, जो आउटपुट उत्पन्न करने के लिए है। इसके तर्क उपयुक्त प्रारूप में उत्पन्न की जाने वाली फ़ाइलें हैं।
जनरेटर को इस प्रकार चलाएँ:
./gif-fuzzer fuzz output.gif
एक यादृच्छिक बाइनरी फ़ाइल output.gif बनाने के लिए, या:
./gif-fuzzer fuzz out1.gif out2.gif out3.gif
तीन GIF फ़ाइलें out1.gif, out2.gif, और out3.gif बनाने के लिए।
ध्यान दें कि हमने जो gif.bt टेम्पलेट प्रदान किया है, उसे वैध फ़ाइलों का निर्माण आसान बनाने के लिए विशेष कार्यों के साथ बढ़ाया गया है। यदि आप बिना अनुकूलन के मूल .bt टेम्पलेट फ़ाइलों का उपयोग करते हैं, तो आपको निर्माण के दौरान चेतावनियाँ मिल सकती हैं और अमान्य फ़ाइलें बन सकती हैं।
आप parse कमांड का उपयोग करके फ़ज़र को बाइनरी फ़ाइलों के पार्सर के रूप में भी चला सकते हैं। यह उपयोगी है यदि आप बाइनरी टेम्पलेट की सटीकता का परीक्षण करना चाहते हैं, या यदि आप किसी इनपुट को म्यूटेट करना चाहते हैं (नीचे 'निर्णय फ़ाइलें' देखें)।
पार्सर चलाने के लिए, उपयोग करें:
./gif-fuzzer parse input.gif
यदि input.gif को सफलतापूर्वक पार्स नहीं किया जा सकता है, तो आपको त्रुटि संदेश दिखाई देंगे।
पार्सिंग के दौरान, आप सभी पार्सिंग निर्णयों (अर्थात् कौन से पार्सिंग विकल्प चुने गए) को एक निर्णय फ़ाइल में भी संग्रहीत कर सकते हैं। यह लिए गए निर्णयों को गिनाने वाले बाइट्स का एक अनुक्रम है।
प्रत्येक बाइट एक एकल पार्सिंग निर्णय को दर्शाता है। बाइट मान 0 का अर्थ है कि पहला विकल्प चुना गया, बाइट मान 1 का अर्थ है कि दूसरा विकल्प चुना गया, और इसी प्रकार आगे।
आप किसी इनपुट को पार्स करते समय ऐसी निर्णय फ़ाइल उत्पन्न कर सकते हैं:
./gif-fuzzer parse --decisions input.dec input.gif
यहाँ, input.dec input.gif को पार्स करने के लिए किए गए निर्णयों को संग्रहीत करता है।