पोन्से
पोन्से (उच्चारण [ 'poN θe ] पॉन-दे) एक IDA Pro प्लगइन है जो उपयोगकर्ताओं को बाइनरी पर आसान और सहज तरीके से टेंट विश्लेषण और सिंबॉलिक निष्पादन करने की क्षमता प्रदान करता है। पोन्से के साथ, आप अत्याधुनिक सिंबॉलिक निष्पादन की सारी शक्ति से एक क्लिक दूर हैं। पूरी तरह से C/C++ में लिखा गया।
क्यों?
सिंबॉलिक निष्पादन सुरक्षा समुदाय में कोई नई अवधारणा नहीं है। यह कई वर्षों से मौजूद है, लेकिन 2015 के आसपास ही Triton और Angr जैसी ओपन सोर्स परियोजनाएँ इस आवश्यकता को पूरा करने के लिए बनाई गईं। इन परियोजनाओं की उपलब्धता के बावजूद, अंतिम उपयोगकर्ताओं को अक्सर स्वयं विशिष्ट उपयोग के मामलों को लागू करना पड़ता है।
हमने पोन्से बनाकर इन आवश्यकताओं को संबोधित किया, जो एक IDA प्लगइन है जो रिवर्स इंजीनियरों के लिए सबसे अधिक उपयोग किए जाने वाले डिस्सेम्बलर/डीबगर में सिंबॉलिक निष्पादन और टेंट विश्लेषण लागू करता है।
स्थापना
पोन्से किसी भी IDA संस्करण >= 7.0 में x86 और x64 बाइनरी दोनों के साथ काम करता है। प्लगइन स्थापित करना उतना ही सरल है जितना कि नवीनतम बिल्ड से उपयुक्त फ़ाइलों को अपने IDA इंस्टॉलेशन डायरेक्टरी में plugins\ फ़ोल्डर में कॉपी करना।
सुनिश्चित करें कि आप अपने IDA संस्करण के लिए संकलित पोन्से बाइनरी का उपयोग कर रहे हैं ताकि कोई असंगति न हो।
OS समर्थन
पोन्से विंडोज, लिनक्स और OSX पर मूल रूप से काम करता है!
उपयोग के मामले
- एक्सप्लॉइट विकास: पोन्से एक्सप्लॉइट डेवलपर को अधिक कुशल तरीके से एक्सप्लॉइट बनाने में मदद कर सकता है, क्योंकि डेवलपर आसानी से देख सकता है कि मेमोरी के कौन से भाग और कौन से रजिस्टर नियंत्रण में हैं, साथ ही संभावित पते जिन्हें ROP गैजेट के रूप में उपयोग किया जा सकता है।
- मैलवेयर विश्लेषण: पोन्से का एक अन्य उपयोग मैलवेयर कोड से संबंधित है। किसी विशेष मैलवेयर परिवार द्वारा समर्थित कमांड का विश्लेषण एक ज्ञात कमांड को सिंबॉलिज़ करके और उन सभी शर्तों को नकार कर आसानी से निर्धारित किया जा सकता है जहाँ कमांड की जाँच की जा रही है।
- प्रोटोकॉल रिवर्सिंग: सबसे दिलचस्प पोन्से उपयोगों में से एक नियंत्रित उपयोगकर्ता इनपुट के लिए आवश्यक मैजिक नंबर, हेडर या संपूर्ण प्रोटोकॉल को पहचानने की क्षमता है। उदाहरण के लिए, पोन्से आपको किसी दिए गए कमांड लाइन बाइनरी के लिए स्वीकृत सभी तर्कों को सूचीबद्ध करने या किसी विशिष्ट फ़ाइल पार्सर के लिए आवश्यक फ़ाइल प्रारूप निकालने में मदद कर सकता है।
- CTF: पोन्से CTF के दौरान बाइनरी के रिवर्स इंजीनियरिंग की प्रक्रिया को तेज करता है। चूंकि पोन्से पूरी तरह से IDA में एकीकृत है, इसलिए आपको सेटअप के समय के बारे में चिंता करने की आवश्यकता नहीं है। यह उपयोग के लिए तैयार है!
प्लगइन स्वचालित रूप से चलेगा, पहली बार चलने पर आपको प्रारंभिक कॉन्फ़िगरेशन के माध्यम से मार्गदर्शन करेगा। कॉन्फ़िगरेशन एक कॉन्फ़िगरेशन फ़ाइल में सहेजा जाएगा, इसलिए आपको कॉन्फ़िग विंडो के बारे में फिर से चिंता करने की आवश्यकता नहीं होगी।
उपयोग मोड
- टेंटिंग इंजन: इस इंजन का उपयोग बाइनरी के निष्पादन के प्रत्येक चरण में यह निर्धारित करने के लिए किया जाता है कि मेमोरी और रजिस्टरों के कौन से भाग उपयोगकर्ता इनपुट द्वारा नियंत्रणीय हैं।
- सिंबॉलिक इंजन: यह इंजन बाइनरी के निष्पादन पथ के प्रत्येक चरण में रजिस्टरों और मेमोरी के कुछ हिस्सों की सिंबॉलिक स्थिति बनाए रखता है।
उदाहरण
एक शर्त को नकारें और इंजेक्ट करें
निम्नलिखित gif में हम स्वचालित टेंटिंग का उपयोग देख सकते हैं और कैसे हम एक शर्त को नकार सकते हैं और इसे डीबगिंग के दौरान मेमोरी में इंजेक्ट कर सकते हैं:
- हम सिंबॉलिक इंजन चुनते हैं और
argv को सिंबॉलिज़ करने का विकल्प सेट करते हैं।
- हम उस शर्त की पहचान करते हैं जिसे crackMe को जीतने के लिए पूरा किया जाना आवश्यक है।
- हम हर बार जब हमारे इनपुट के एक बाइट की कुंजी के विरुद्ध जाँच की जाती है, तो समाधान को नकारते और इंजेक्ट करते हैं।
- अंत में हमें कुंजी
elite मिलती है जो मेमोरी में इंजेक्ट की गई है और इस प्रकार Win कोड तक पहुँचते हैं।
क्रैकमी का स्रोत कोड यहाँ पाया जा सकता है।

उपयोगकर्ता नियंत्रित इनपुट को ट्रैक करने के लिए टेंटिंग इंजन का उपयोग करना
इस उदाहरण में हम cmake के साथ टेंटिंग इंजन का उपयोग देख सकते हैं। हम:
- cmake को पार्स करने के लिए एक फ़ाइल को तर्क के रूप में पारित कर रहे हैं।
- हम चुनते हैं कि हम टेंटिंग इंजन का उपयोग करना चाहते हैं।
- हम
fread() द्वारा फ़ाइल से पढ़े गए बफर को टेंट करते हैं।
- हम डीबगर नियंत्रण के तहत निष्पादन फिर से शुरू करते हैं ताकि देख सकें कि टेंट इनपुट कहाँ स्थानांतरित होता है।
- पोन्से टेंटेड फ़ंक्शंस का नाम बदल देगा। ये वे फ़ंक्शन हैं जिन पर उपयोगकर्ता का किसी तरह प्रभाव है, न कि केवल निष्पादित फ़ंक्शन।

नकारें, इंजेक्ट करें और पुनर्स्थापित करें का उपयोग करना
अगले उदाहरण में हम स्नैपशॉट इंजन का उपयोग कर रहे हैं:
- एक फ़ाइल को तर्क के रूप में पारित करना।
- हम चुनते हैं कि हम सिंबॉलिक इंजन का उपयोग करना चाहते हैं।
- हम
fread() द्वारा फ़ाइल से पढ़े गए बफर को टेंट करते हैं।
- हम उस फ़ंक्शन में एक स्नैपशॉट बनाते हैं जो फ़ाइल से पढ़े गए बफर को पार्स करता है।
- जब एक शर्त का मूल्यांकन किया जाता है, तो हम उसे नकारते हैं, समाधान को मेमोरी में इंजेक्ट करते हैं और इसके साथ स्नैपशॉट को पुनर्स्थापित करते हैं।
- समाधान "मान्य" होगा, इसलिए हम मौजूदा शर्तों को संतुष्ट करेंगे।
उदाहरण का स्रोत कोड यहाँ पाया जा सकता है।
उपयोग
इस अनुभाग में हम विभिन्न पोन्से विकल्पों के साथ-साथ कीबोर्ड शॉर्टकट सूचीबद्ध करेंगे:
- कॉन्फ़िगरेशन और टेंट/सिंबॉलिक विंडो तक पहुँचें: Edit > Ponce > Show Config (Ctl+Shift+P और Ctl+Alt+T)

- पोन्से ट्रेसिंग सक्षम/अक्षम करें (Ctl+Shift+E)

- एक रजिस्टर को सिंबॉलिज़/टेंट करें (Ctl+Shift+R)

- मेमोरी को सिंबॉलिज़/टेंट करें। IDA व्यू या हेक्स व्यू से किया जा सकता है (Ctl+Shift+M)



- सूत्र हल करें (Ctl+Shift+S)