
Go बाइनरीज़ में स्ट्रिंग परिभाषाओं को पुनर्प्राप्त करने के लिए Ghidra स्क्रिप्ट्स
Go बाइनरीज़ में P-Code विश्लेषण के साथ स्ट्रिंग परिभाषाओं को पुनर्प्राप्त करने के लिए स्क्रिप्ट्स। x86, x86-64, ARM, और ARM64 पर परीक्षण किया गया।
ये Script Manager में Golang श्रेणी में पाए जा सकते हैं।
GoDynamicStrings.java
GoFuncCallStrings.java
GoStaticStrings.java
GoKnownStrings.java
data/known_strings.json से लोड किया जाता है।GoStringFiller.java
go.string.* में अंतराल को भरता है।डायनामिक स्ट्रिंग विश्लेषण स्क्रिप्ट की कुछ विशेष विविधताएँ भी हैं:
GoDynamicStringsSingle.java
GoDynamicStrings.java के समान विश्लेषण करता है, लेकिन एक एकल डीकंपाइलर प्रक्रिया का उपयोग करता है। इसका उपयोग करें यदि किसी बाइनरी का विश्लेषण करने से समानांतर डीकंपाइलर प्रक्रियाओं द्वारा सिस्टम मेमोरी समाप्त हो जाती है।GoDynamicStringsHigh.java
यह Script Manager में PCode श्रेणी में पाया जा सकता है।
PrintHighPCode.java
Go बाइनरी में स्ट्रिंग परिभाषाओं को पुनर्प्राप्त करने के लिए इन स्क्रिप्ट्स का उपयोग करने का सामान्य प्रवाह यहाँ है:
.rodata, .rdata, या __rodata में सभी स्ट्रिंग्स का चयन करें। फिर कोड लिस्टिंग में राइट-क्लिक करें और "Clear Code Bytes" चुनें।GoKnownStrings.java चलाएँ।GoStaticStrings.java चलाएँ।GoFuncCallStrings.java चलाएँ (यदि Golang बाइनरी संस्करण Ghidra की अंतर्निहित Golang सुविधाओं द्वारा समर्थित है)।GoDynamicStrings.java चलाएँ।GoStringFiller.java चलाएँ।
go.string.* बनाएं।Ghidra में:
GhidraDev प्लगइन के साथ Eclipse के लिए:
Eclipse के साथ निर्माण करें:
Gradle के साथ सीधे निर्माण करें:
$ cd Ghostrings
$ gradle -PGHIDRA_INSTALL_DIR=<ghidra_install_dir>
Go प्रोग्रामों के रिवर्स इंजीनियरिंग के साथ एक प्रसिद्ध समस्या यह है कि Go स्ट्रिंग्स में नल टर्मिनेटर की कमी संकलित बाइनरीज़ से स्ट्रिंग परिभाषाओं को पुनर्प्राप्त करना कठिन बना देती है। एक Go प्रोग्राम के कई स्थिर स्ट्रिंग मान संकलित बिल्ड में एक विशाल ब्लॉब में एक साथ संग्रहीत होते हैं, बिना किसी टर्मिनेटर वर्ण के जो यह चिह्नित करते हैं कि एक स्ट्रिंग कहाँ समाप्त होती है और दूसरी शुरू होती है। यहां तक कि एक साधारण प्रोग्राम जो केवल "Hello world!" प्रिंट करता है, उसमें Go रनटाइम सिस्टम और अन्य मानक पुस्तकालयों से संबंधित 1,500 से अधिक स्ट्रिंग्स होती हैं। यह सामान्य ASCII स्ट्रिंग खोज कार्यान्वयन, जैसे कि Ghidra द्वारा प्रदान किया गया, को हजारों वर्णों लंबी गलत सकारात्मक स्ट्रिंग परिभाषाएँ बनाने का कारण बन सकता है।
नल-समाप्त स्ट्रिंग्स के बजाय, Go एक स्ट्रिंग संरचना का उपयोग करता है जिसमें एक पॉइंटर और लंबाई मान होता है। इनमें से कई स्ट्रिंग संरचनाएँ रनटाइम पर प्रोग्राम के स्टैक पर बनाई जाती हैं, इसलिए व्यक्तिगत स्ट्रिंग प्रारंभ स्थानों और लंबाई मानों को पुनर्प्राप्त करने के लिए संकलित मशीन कोड का विश्लेषण करने की आवश्यकता होती है। कुछ मौजूदा स्क्रिप्ट हैं जो x86-64 निर्देशों के कुछ पैटर्न की जाँच करके यह विश्लेषण करती हैं, लेकिन वे निर्देशों के अनियंत्रित विविधताओं के साथ बनाई गई संरचनाओं को छोड़ देती हैं जिनका अंततः स्टैक पर समान प्रभाव होता है, और वे एक विशिष्ट ISA तक भी सीमित हैं।
Ghostrings इन दोनों समस्याओं से बचता है, Ghidra के डीकंपाइलर विश्लेषण द्वारा उत्पादित सरलीकृत, आर्किटेक्चर-स्वतंत्र P-Code संचालन के साथ काम करके।
कॉपीराइट 2022 NCC Group। GPLv3 लाइसेंस के तहत जारी (देखें LICENSE)।
मुख्य परियोजना लेखक: James Chambers [email protected]
go.string.* में शेष अंतराल की जाँच करें, और स्पष्ट प्रारंभ और अंत बिंदुओं वाली किसी भी स्ट्रिंग को परिभाषित करें।
GoStringFiller.java का अधिकतम उपयोग करने के लिए, पहचानें कि अपरिभाषित स्ट्रिंग डेटा में स्ट्रिंग लंबाई कहाँ बदल रही है और उस सीमा के निकटतम स्ट्रिंग्स को परिभाषित करें। फिर GoStringFiller.java को फिर से चलाएँ ताकि यह स्वचालित रूप से उन स्थानों को भर सके जहाँ यह शेष अपरिभाषित स्ट्रिंग्स की लंबाई सही ढंग से निर्धारित कर सकता है।