BF Forked & Threaded Stack Canaries
यदि आपके सामने एक कैनरी द्वारा संरक्षित बाइनर है और PIE (पोजीशन इंडिपेंडेंट एक्जीक्यूटेबल) को बायपास करने की आवश्यकता हो सकती है।
ध्यान दें कि checksec
यह नहीं पता लगा सकता कि एक बाइनर कैनरी द्वारा संरक्षित है अगर यह स्थैतिक रूप से कंपाइल किया गया था और यह फ़ंक्शन को पहचानने की क्षमता नहीं है।
हालांकि, आप मैन्युअल रूप से इसे ध्यान में रख सकते हैं अगर आपको यह मिलता है कि एक मान को फ़ंक्शन कॉल की शुरुआत में स्टैक में सहेजा गया है और इस मान की जांच की जाती है प्रक्रिया से बाहर निकलने से पहले।
Brute force Canary
एक साधारण कैनरी को बायपास करने का सबसे अच्छा तरीका यह है अगर बाइनर एक कार्यक्रम है जो प्रत्येक बार जब आप इसके साथ एक नया कनेक्शन स्थापित करते हैं तो बच्चा प्रक्रियाएँ बनाता है (नेटवर्क सेवा), क्योंकि हर बार जब आप इससे कनेक्ट करते हैं वही कैनरी उपयोग की जाएगी।
इसके बाद, कैनरी को बायपास करने का सबसे अच्छा तरीका है केवल चार द्वारा इसे ब्रूट-फ़ोर्स करना, और आप यह देख सकते हैं कि क्या अनुमानित कैनरी बाइट सही था या गलत बाइट बस यह जांच करके कि क्या सर्वर द्वारा एक प्रतिक्रिया भेजी गई है (अन्य स्थिति में एक try/except का उपयोग करना सक्षम हो सकता है):
उदाहरण 1
यह उदाहरण 64 बिट के लिए लागू किया गया है लेकिन आसानी से 32 बिट के लिए लागू किया जा सकता है।
उदाहरण 2
यह 32 बिट के लिए लागू किया गया है, लेकिन इसे आसानी से 64 बिट के लिए बदला जा सकता है। इस उदाहरण के लिए प्रोग्राम से पहले एक बाइट की आवश्यकता है जो इनपुट का आकार और पेलोड को दर्शाती है।
धागे
एक ही प्रक्रिया के धागे भी एक ही कैनरी टोकन को साझा करेंगे, इसलिए यदि बाइनरी हर बार एक हमला होता है तो कैनरी को ब्रूट-फोर्स किया जा सकता है।
इसके अतिरिक्त, एक धागे वाले फ़ंक्शन में एक बफर ओवरफ्लो जिसे कैनरी से सुरक्षित किया गया हो, का उपयोग करके TLS में स्टोर किए गए मास्टर कैनरी को संशोधित किया जा सकता है। यह इसलिए है क्योंकि, एक धागे के स्टैक में बफर ओवरफ्लो के माध्यम से TLS स्टोर किया जाता है (और इसलिए, कैनरी) के मेमोरी स्थिति तक पहुंचना संभव हो सकता है। इस परिणामस्वरूप, संरोधन अप्रभावी है क्योंकि जांच दो कैनरी के साथ की जाती है जो समान हैं (हालांकि संशोधित हैं)। यह हमला निम्नलिखित लेख में किया जाता है: http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads
https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015 के प्रस्तुति को भी देखें जिसमें उल्लेख किया गया है कि आम तौर पर TLS को mmap
द्वारा स्टोर किया जाता है और जब एक धागे का स्टैक बनाया जाता है तो यह mmap
द्वारा उत्पन्न किया जाता है जिसके अनुसार, पिछले लेख में दिखाया गया ओवरफ्लो की अनुमति हो सकती है।
अन्य उदाहरण और संदर्भ
64 बिट, कोई PIE नहीं, nx, BF कैनरी, किसी मेमोरी में
execve
को कॉल करने के लिए ROP लिखें और वहाँ जाएं।
Last updated