
TriforceAFL (अर्थात AFL और QEMU) का उपयोग करके OpenBSD amd64 की सिस्टम कॉल फ़ज़िंग
यह TriforceAFL (अर्थात AFL और QEMU) का उपयोग करके OpenBSD amd64 के सिस्टम कॉल फ़ज़िंग (system call fuzzing) के लिए उपयोग की जाने वाली फ़ाइलों का एक संग्रह है। इसे उपयोग करने के लिए आपको TriforceAFL (https://github.com/nccgroup/TriforceAFL), FlashRD 2.0 डिस्ट्रीब्यूशन (http://www.nmedia.net/flashrd/), ड्राइवर और डिस्क इमेज बनाने के लिए एक OpenBSD मशीन, तथा फ़ज़र चलाने के लिए एक Linux होस्ट मशीन की आवश्यकता होगी (अन्य फ़ज़र होस्ट भी काम कर सकते हैं, हमने TriforceAFL को केवल Linux होस्ट से चलाया है, विशेष रूप से Debian/Ubuntu)।
हम OpenBSD मशीन पर सब कुछ root के रूप में करेंगे, क्योंकि इस मशीन का उपयोग केवल हमारे वातावरण को बूटस्ट्रैप करने के लिए किया जा रहा है। यदि आपके पास पहले से कोई OpenBSD मशीन है, तो बेझिझक इसमें से कम काम root के रूप में करें। यदि आप एक अनुभवी OpenBSD उपयोगकर्ता हैं, तो इसका अधिकांश भाग अनावश्यक रूप से विस्तृत लगेगा। खैर, आगे बढ़ते हैं!
OpenBSD मशीन पर:
export PKG_PATH=http://mirrors.sonic.net/pub/OpenBSD/$(uname -r)/packages/$(uname -m)/
pkg_add git
pkg_add python # pick python 2.7
इसके बाद आपको OpenBSD सोर्स और कर्नेल सोर्स डाउनलोड करने होंगे, और फिर उन्हें अनपैक करना होगा:
cd ~
ftp http://mirrors.sonic.net/pub/OpenBSD/5.9/src.tar.gz
ftp http://mirrors.sonic.net/pub/OpenBSD/5.9/sys.tar.gz
cd /usr/src; tar -xzpf $HOME/src.tar.gz; tar -xzpf $HOME/sys.tar.gz;
यदि आपके पास पहले से कोई इंस्टॉल CD है, तो निम्नलिखित फ़ाइलों को डाउनलोड करने की आवश्यकता नहीं है (क्योंकि वे $CDMOUNT/5.9/amd64/*.tgz में मौजूद होंगी)। आपको केवल $DISTDIR को उचित रूप से सेट करने की आवश्यकता होगी। अन्यथा...
cd ~
ftp http://mirrors.sonic.net/pub/OpenBSD/5.9/amd64/base59.tgz
ftp http://mirrors.sonic.net/pub/OpenBSD/5.9/amd64/man59.tgz
ftp http://mirrors.sonic.net/pub/OpenBSD/5.9/amd64/comp59.tgz
ftp http://mirrors.sonic.net/pub/OpenBSD/5.9/amd64/game59.tgz
export DISTDIR=~
अब हमारे पास आवश्यक निर्भरताएँ (dependencies) इंस्टॉल हैं, और हम चीज़ें बनाना शुरू कर सकते हैं।
TriforceOpenBSDFuzzer डायरेक्टरी में प्रवेश करें। इसमें अलग-अलग डायरेक्टरी हैं जिनमें OpenBSD फ़ाइलें (targ) और फ़ज़र होस्ट फ़ाइलें (fuzzHost) मौजूद हैं।
किसी OpenBSD होस्ट पर, targ डायरेक्टरी में प्रवेश करें और make चलाएँ।
आपको इसी डायरेक्टरी से इनपुट फ़ाइलें भी बनानी चाहिए
mkdir inputs
./gen.py # build simple tests
./genTempl.py templ.txt # build most syscall tests
./gen2.py # build complex syscall tests
tar -czf ../inputs.tgz inputs
आगे, आपको FlashRD डिस्ट्रीब्यूशन (http://www.nmedia.net/flashrd/) का उपयोग करके ड्राइवर के साथ एक डिस्क इमेज बनानी होगी। OpenBSD होस्ट पर (ऊपर दिए गए अनुभाग के अनुसार /usr/src में सोर्स और /usr/src/sys में कर्नेल सोर्स के साथ), हम अब कई चीज़ें करेंगे:
cd ~ #make sure this is on your /home parition, you will need significant disk space for this
ftp http://www.nmedia.net/flashrd/flashrd-2.0.tar.gz
tar xzf flashrd-2.0.tar.gz
cd flashrd-2.0
patch -p1 < $FUZZER/image-diff.txt #set $FUZZER to where you cloned TriforceOpenBSDFuzzer
mkdir obsd
cd obsd
tar xzpf $DISTDIR/base59.tgz
tar xzpf $DISTDIR/man59.tgz
tar xzpf $DISTDIR/comp59.tgz
tar xzpf $DISTDIR/game59.tgz
tar xzpf /var/sysmerge/etc.tgz
cp $FUZZER/image-etc-rc etc/rc
cp $FUZZER/targ/inputs/ex1 root/ex1
cd ..
आप अब इन कमांड्स को चलाकर एक इमेज बना सकते हैं:
cp $FUZZER/targ/driver obsd/bin/driver
./flashrd obsd
mv flashimg* $FUZZER/flashimg.bin
mv bsd.gdb $FUZZER/bsd.gdb
flashimg.bin और bsd.gdb की एक प्रति सहेज लें। फ़ज़र होस्ट पर आपको उनकी आवश्यकता होगी।
आप डिबगिंग के लिए एक दूसरी इमेज बनाना चाह सकते हैं जो आपको एक इंटरैक्टिव शेल चलाने की सुविधा देती है। obsd/etc/rc को संपादित करें और /bin/driver -v को /bin/sh -i से बदलें, और एक दूसरी इमेज बनाएँ। फिर हम बाद में उपयोग के लिए flashimg-sh.bin और bsd-sh.gdb की एक प्रति सहेज लेंगे।
./flashrd obsd
mv flashimg* $FUZZER/flashimg-sh.bin
mv bsd.gdb $FUZZER/bsd-sh.gdb
अब हम OpenBSD मशीन छोड़ सकते हैं, और अपने फ़ज़ होस्ट पर लौट सकते हैं ($FUZZER को बाहर कॉपी करना सुनिश्चित करें, ताकि हम इसे फ़ज़ होस्ट पर उपयोग कर सकें)।
हम फ़ज़र को Linux होस्ट पर चलाते हैं (यह किसी भी होस्ट पर काम करना चाहिए जहाँ TriforceAFL बिल्ड और रन होता है, लेकिन आपका अनुभव भिन्न हो सकता है (YMMV), विशेष रूप से गैर-Linux होस्ट पर)।
फ़ज़र होस्ट पर, TriforceAFL को ../TriforceAFL में इंस्टॉल करें।
flashimg*.bin और bsd*.gdb को fuzzhost डायरेक्टरी में कॉपी करें,
और इनपुट को fuzzHost डायरेक्टरी में अनपैक करें:
cd TriforceOpenBSDFuzzer # this should now have the files we made on the BSD host in it
cp flashimg* fuzzHost/
cp bsd* fuzzHost/
cd fuzzhost
tar xzf ../inputs.tgz
अब हम फ़ज़ करने के लिए तैयार हैं! fuzzHost डायरेक्टरी में प्रवेश करें
और ./runFuzz -M M0 के साथ फ़ज़र शुरू करें।
ध्यान दें कि runFuzz स्क्रिप्ट एक master या slave नाम की अपेक्षा करती है, क्योंकि
यह हमेशा master/slave मोड में चलती है। अधिक उपयोग जानकारी के लिए runFuzz स्क्रिप्ट देखें।
टेस्ट केसों (जैसे क्रैश) को पुनरुत्पादित करने के लिए, फ़ज़र होस्ट पर चलाएँ:
./runTest inputs/ex1
./runTest outputs/crashes/id*
आप ड्राइवर को इम्यूलेटेड वातावरण से बाहर भी चला सकते हैं
-t विकल्प के साथ, -vv के साथ विस्तृत (verbose) लॉगिंग के साथ
और -x के साथ वास्तव में सिस्टम कॉल किए बिना।
उदाहरण के लिए, OpenBSD होस्ट पर चलाएँ:
./driver -tvvx < inputs/ex1
ktrace ./driver -t < inputs/ex1
कभी-कभी कर्नेल को बूट करना और इंटरैक्टिव रूप से टेस्ट चलाना उपयोगी होता है। आप एक इंटरैक्टिव शेल में बूट करने के लिए ./runSh चला सकते हैं।
आप शायद परीक्षण के लिए flashimg-sh.bin फ़ाइल में अतिरिक्त फ़ाइलें (जैसे टेस्ट केस) जोड़ना चाहेंगे। ऐसा करने के लिए, OpenBSD होस्ट पर अतिरिक्त फ़ाइलों को flashrd-2.0/obsd/root में कॉपी करें और फ्लैश इमेज को फिर से बनाएँ। फ़ाइलों को वापस अपने फ़ज़र होस्ट पर स्थानांतरित करें और फिर से runSh चलाएँ। आपको अतिरिक्त फ़ाइलें /root डायरेक्टरी में मिलेंगी। आप इसे बनाने के बाद, OpenBSD होस्ट पर root के रूप में फ्लैश इमेज में फ़ाइलें भी जोड़ सकते हैं:
vnconfig vnd0 ./flashimg.bin
mount /dev/vnd0a /mnt
cp file /mnt
umount /mnt
vnconfig -u vnd0
यहाँ जोड़ी गई फ़ाइलें इमेज बूट होने पर /flash में दिखाई देंगी
पहले flashrd डिस्ट्रीब्यूशन पर लागू किए गए पैच कर्नेल बनाते समय डिबगिंग सक्षम करेंगे और ऑप्टिमाइज़ेशन अक्षम करेंगे। इससे डिबगिंग बहुत आसान हो जाती है।
fuzzHost से कर्नेल को डिबग करने के लिए, अपने OpenBSD होस्ट से /usr/src/sys की एक प्रति बनाएँ, और bsd-sh.gdb को sys/x/x/x/x में कॉपी करें।
एक विंडो में ./runSh चलाएँ और सिस्टम बूट होने के बाद चलाएँ
cd sys
mkdir -p x/x/x/x
cd x/x/x/x
cp $FUZZER/bsd-sh.gdb .
gdb -ex "target remote :1234" ./bsd-sh.gdb