
एक radare2 स्क्रिप्ट जो gopclntab को पार्स करके Go बाइनरी के रिवर्स इंजीनियरिंग को सुविधाजनक बनाती है।
नोट: यह सुविधा सीधे radare2 के कोर में gopc analysis plugin के रूप में लागू की गई है।
Go बाइनरीज़ से फंक्शन सिंबल पुनर्प्राप्त करने के लिए एक radare2-आधारित Go gopclntab पार्सर, जिसमें पूरी तरह से स्ट्रिप किए गए बाइनरी भी शामिल हैं। ELF, Mach-O, और PE बाइनरी को Go संस्करण 1.2, 1.16, 1.18, और 1.20+ में सपोर्ट करता है।
प्रत्येक Go 1.2+ बाइनरी में gopclntab (Program Counter Line Table) नामक एक डेटा क्षेत्र एम्बेड होता है जिसका उपयोग Go रनटाइम स्टैक ट्रेस, पैनिक संदेश, गार्बेज कलेक्शन और डीबगर सपोर्ट के लिए करता है। यह Go बाइनरी में सिंबल जानकारी के सबसे मूल्यवान स्रोतों में से एक है।
r2gopclntabParser radare2 के माध्यम से इस क्षेत्र को पढ़ता है, संस्करण-विशिष्ट संरचनाओं को पार्स करता है, और या तो पुनर्प्राप्त फंक्शन सूची (पतों, स्रोत फ़ाइलों और लाइन नंबरों के साथ) प्रिंट करता है या पुनर्प्राप्त नामों को फंक्शन परिभाषाओं, फ्लैग्स और टिप्पणियों के रूप में खुले radare2 सत्र में वापस लागू करता है।
| निर्भरता | न्यूनतम संस्करण |
|---|---|
| Python 3 | 3.8+ |
| radare2 | 5.0+ (6.0.9 पर परीक्षित) |
| r2pipe | कोई भी |
किसी अन्य Python पैकेज की आवश्यकता नहीं है। स्क्रिप्ट केवल मानक लाइब्रेरी (struct, json, argparse, os, sys) और r2pipe का उपयोग करती है।
python3 r2_gopclntab.py -f ./mybinary -l
python3 r2_gopclntab.py -f ./mybinary -n main.main
python3 r2_gopclntab.py -f ./mybinary -v -l
python3 r2_gopclntab.py -f ./mybinary --apply
python3 r2_gopclntab.py -f ./mybinary --json
#!pipe python3 r2_gopclntab.py --r2pipe --apply -v
## CLI संदर्भ```
usage: r2_gopclntab.py [-h] [-f FILE] [-n FUNCNAME] [-v] [-l]
[--apply] [--json] [--files] [--r2pipe]
| Flag | Description |
|---|---|
-f FILE, --file FILE | विश्लेषण करने के लिए Go बाइनरी का पथ। स्क्रिप्ट अपना स्वयं का r2 उदाहरण शुरू करती है। |
--r2pipe | पहले से चल रहे r2 सत्र से जुड़ें (r2 कंसोल के अंदर उपयोग के लिए)। |
| Flag | Description |
|---|---|
-l, --list | प्रत्येक पुनर्प्राप्त फ़ंक्शन को उसके पते के साथ प्रिंट करें। |
-n NAME, --funcname NAME | केवल उन फ़ंक्शनों को प्रिंट करें जिनके नाम में NAME है (सबस्ट्रिंग मिलान)। यदि कोई सटीक मिलान मौजूद है, तो उसका पता अलग से प्रिंट किया जाता है। |
-v, --verbose | प्रगति संदेश, पार्स किए गए हेडर फ़ील्ड और आंतरिक ऑफ़सेट प्रिंट करें। |
--apply | पुनर्प्राप्त फ़ंक्शन नामों को radare2 सत्र में फ़ंक्शन परिभाषाओं (af+), go. फ़्लैगस्पेस में फ़्लैग, और मूल Go नाम और स्रोत स्थान के साथ टिप्पणियों के रूप में लिखें। |
--json | हेडर और पूर्ण फ़ंक्शन सूची को JSON के रूप में stdout पर आउटपुट करें। |
--files | फ़ाइल तालिका से निकाले गए स्रोत फ़ाइल पथों की सूची प्रिंट करें। |
-h, --help | सहायता संदेश दिखाएँ। |
फ़्लैग को स्वतंत्र रूप से जोड़ा जा सकता है। जब कोई आउटपुट फ़्लैग नहीं दिया जाता है, तो डिफ़ॉल्ट व्यवहार हेडर और पूर्ण फ़ंक्शन सूची को प्रिंट करना है।
नीचे दिए गए सभी उदाहरण एक स्ट्रिप की गई Go 1.26 Mach-O arm64 बाइनरी (जो -ldflags="-s -w" के साथ बनाई गई है) पर चलाए गए थे। परीक्षण प्रोग्राम main.main, main.fibonacci, main.helloWorld, और main.addNumbers को परिभाषित करता है। कंपाइलर ने helloWorld और addNumbers को इनलाइन कर दिया, इसलिए वे gopclntab में दिखाई नहीं देते।
बिना किसी फ़्लैग (या केवल -f) के चलाने पर पार्स किया गया हेडर और उसके बाद पूर्ण फ़ंक्शन तालिका प्रिंट होती है:```
$ python3 r2_gopclntab.py -f ./gotest_stripped
[No content provided in the INPUT section.]```
============================================================
Go pclntab Header
============================================================
Magic: 0xFFFFFFF1
Go version: 1.20+
Pointer size: 8
Min LC (quantum):4
Num functions: 2030
Num files: 261
funcnameOffset: 0x48
cuOffset: 0x14D20
filetabOffset: 0x158D8
pctabOffset: 0x19A98
pclnOffset: 0x55E40
============================================================
ADDRESS FUNCTION NAME
----------------------------------------------------------------------
0x100001000 go:buildid
0x100001070 internal/abi.BoundsDecode (/opt/homebrew/Cellar/go/1.26.1/libexec/src/internal/abi/bounds.go:86)
0x100001150 internal/abi.NoEscape (/opt/homebrew/Cellar/go/1.26.1/libexec/src/internal/abi/escape.go:19)
0x100001160 internal/abi.Kind.String (/opt/homebrew/Cellar/go/1.26.1/libexec/src/internal/abi/type.go:143)
0x1000011E0 internal/abi.TypeOf (/opt/homebrew/Cellar/go/1.26.1/libexec/src/internal/abi/type.go:181)
0x1000011F0 internal/abi.(*Type).ExportedMethods (/opt/homebrew/Cellar/go/1.26.1/libexec/src/internal/abi/type.go:453)
...
0x1000A0BB0 main.fibonacci (/tmp/gotest/main.go:13)
0x1000A0C20 main.main (/tmp/gotest/main.go:20)
0x1000A0D20 go:textfipsstart
0x1000A0D30 go:textfipsend
[+] 2030 function(s) shown
सेक्शन स्कैनिंग प्रगति, textStart रिज़ॉल्यूशन विवरण, और आंतरिक ऑफ़सेट जानकारी जोड़ता है:``` $ python3 r2_gopclntab.py -f ./gotest_stripped -v
## स्थापना
Regexploit को pip के साथ स्थापित करें
```bash
pip install regexploit
और इसे चलाएँ
python -m regexploit
या इसे regexploit.derf.net पर ऑनलाइन आज़माएँ
Regexploit ने कई कमज़ोरियाँ खोजी हैं। सबसे खराब उदाहरण हैं:
\s+ और बहुत सारे रिक्त स्थानों वाले UUID के उपयोग के कारण हुआ।कई और वैध ReDoS कमज़ोरियाँ लोकप्रिय Python लाइब्रेरीज़ में पाई गई हैं, जिनके लिए CVE प्राप्त हुए हैं जैसे Pillow में CVE-2021-25292, httplib2 में CVE-2021-21240, और pygments में CVE-2021-27291। Node.js में भी कई ReDoS कमज़ोरियाँ हैं, जैसे hosted-git-info में CVE-2021-23362। Regexploit ने इन्हें खोजा है, और और भी खोज सकता है।