BF Forked & Threaded Stack Canaries
यदि आपके सामने एक कैनरी द्वारा संरक्षित बाइनरी है और पीआईई (पोजीशन इंडिपेंडेंट एक्जीक्यूटेबल) है, तो आपको उन्हें दरकिनार करने का एक तरीका खोजने की आवश्यकता हो सकती है।
ध्यान दें कि checksec
यह नहीं पता लगा सकता है कि एक बाइनरी को कैनरी द्वारा संरक्षित किया गया है अगर यह स्थाई रूप से कंपाइल किया गया था और यह फ़ंक्शन को पहचानने की क्षमता नहीं है।
हालांकि, आप इसे मैन्युअल रूप से नोट कर सकते हैं अगर आपको लगता है कि किसी मान को फ़ंक्शन कॉल करने के शुरू में स्टैक में सहेजा गया है और इस मान की जांच की गई है पहले बाहर निकलने से पहले।
ब्रूट फ़ोर्स कैनरी
एक साधारण कैनरी को दरकिनार करने का सबसे अच्छा तरीका यह है अगर बाइनरी एक कार्यक्रम है हर बार जब आप इसके साथ एक नया कनेक्शन स्थापित करते हैं तो चाइल्ड प्रक्रियाएँ फॉर्क करता है (नेटवर्क सेवा), क्योंकि हर बार जब आप इससे कनेक्ट करते हैं वही कैनरी उपयोग की जाएगी।
फिर, कैनरी को दरकिनार करने का सबसे अच्छा तरीका यह है केवल चार द्वारा ब्रूट-फ़ोर्स करना, और आप यह देख सकते हैं कि क्या अनुमानित कैनरी बाइट सही था या गलत बाइट बस यह जांच करके कि क्या एक प्रतिक्रिया सर्वर द्वारा वापस भेजी गई है (दूसरे स्थिति में एक प्रयास/अपेक्षा का उपयोग किया जा सकता है):
उदाहरण 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