
Unicorn और LibFuzzer पर आधारित बंद-स्रोत बाइनरी के लिए एक फ़ज़िंग टूल
uniFuzzer एक फज़िंग टूल है जो क्लोज्ड-सोर्स बाइनरीज के लिए Unicorn और LibFuzzer पर आधारित है। वर्तमान में यह ARM/MIPS पर 32-बिट LSB ELF फ़ाइलों को फज़ करने का समर्थन करता है, जो आमतौर पर IoT उपकरणों में देखी जाती हैं।
callback निर्देशिका में एक .c फ़ाइल बनाएं, जिसमें निम्नलिखित कॉलबैक होने चाहिए:void onLibLoad(const char *libName, void *baseAddr, void *ucBaseAddr): यह हर बार कॉल किया जाता है जब Unicorn में एक आश्रित लाइब्रेरी लोड होती है।int uniFuzzerInit(uc_engine *uc): यह सभी बाइनरी के Unicorn में लोड होने के तुरंत बाद कॉल किया जाता है। यहाँ स्टैक/हीप/रजिस्टर सेटअप किए जा सकते हैं।int uniFuzzerBeforeExec(uc_engine *uc, const uint8_t *data, size_t len): यह फज़िंग निष्पादन के प्रत्येक दौर से पहले कॉल किया जाता है।int uniFuzzerAfterExec(uc_engine *uc): यह फज़िंग निष्पादन के प्रत्येक दौर के बाद कॉल किया जाता है।make चलाएँ और uf नामक फज़िंग टूल प्राप्त करें।uniFuzzer निम्नलिखित पर्यावरण चर को पैरामीटर के रूप में उपयोग करता है:
UF_TARGET: लक्ष्य ELF फ़ाइल का पथUF_PRELOAD: प्रीलोड लाइब्रेरी का पथ। कृपया सुनिश्चित करें कि लाइब्रेरी का आर्किटेक्चर लक्ष्य के समान है।UF_LIBPATH: वे पथ जिनमें आश्रित लाइब्रेरी स्थित हैं। कई पथों को अलग करने के लिए : का उपयोग करें।और फज़िंग को निम्नलिखित कमांड का उपयोग करके शुरू किया जा सकता है:
UF_TARGET=<target> [UF_PRELOAD=<preload>] UF_LIBPATH=<libPath> ./uf
बुनियादी उपयोग के लिए एक डेमो आता है। डेमो में निम्नलिखित फ़ाइलें हैं:
vuln() नामक एक सरल फ़ंक्शन है जो स्टैक/हीप ओवरफ़्लो के लिए संवेदनशील है।printf() और सरलीकृत malloc()/free() को परिभाषित करता है।vuln() फ़ंक्शन को फज़ करने के लिए आवश्यक कॉलबैक को परिभाषित करता है।पहले, कृपया mipsel के लिए gcc इंस्टॉल करें (डेबियन पर पैकेज gcc-mipsel-linux-gnu) डेमो बनाने के लिए:
# the target binary
# '-Xlinker --hash-style=sysv' tells gcc to use 'DT_HASH' instead of 'DT_GNU_HASH' for symbol lookup
# since currently uniFuzzer does not support 'DT_GNU_HASH'
mipsel-linux-gnu-gcc demo-vuln.c -Xlinker --hash-style=sysv -no-pie -o demo-vuln
# the preload library
mipsel-linux-gnu-gcc -shared -fPIC -nostdlib -Xlinker --hash-style=sysv demo-libcpreload.c -o demo-libcpreload.so
या आप केवल demo-vuln और demo-libcpreload.so फ़ाइलों का उपयोग कर सकते हैं, जो ऊपर दिए गए कमांड का उपयोग करके संकलित की गई हैं।
अगला, uniFuzzer बनाने के लिए make चलाएँ। कृपया ध्यान दें कि यदि आपने स्वयं MIPS डेमो संकलित किया है, तो कुछ पते प्रीबिल्ट एक से भिन्न हो सकते हैं और demo-callback.c को तदनुसार अपडेट किया जाना चाहिए।
अंत में, सुनिश्चित करें कि MIPS की libc लाइब्रेरी तैयार है। डेबियन पर यह पैकेज libc6-mipsel-cross इंस्टॉल करने के बाद /usr/mipsel-linux-gnu/lib/ में होती है, और यही UF_LIBPATH होना चाहिए:
UF_TARGET=<path to demo-vuln> UF_PRELOAD=<path to demo-libcpreload.so> UF_LIBPATH=<lib path for MIPS> ./uf
Unicorn इस issue के कारण QEMU के JIT कैश को साफ़ करता है, जो फज़िंग की गति को धीमा कर देता है क्योंकि लक्ष्य बाइनरी को निष्पादन के प्रत्येक दौर के दौरान JIT पुनः संकलित करना होगा।
प्रदर्शन के लिए हम उस issue में बताए अनुसार tb_flush(env); को कमेंट आउट कर सकते हैं।
GNU_HASHIFUNC का समर्थन