hacktricks/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries
2024-04-02 19:54:30 +00:00
..
bf-forked-stack-canaries.md Translated ['exploiting/linux-exploiting-basic-esp/README.md', 'reversin 2024-04-02 19:54:30 +00:00
print-stack-canary.md Translated ['exploiting/linux-exploiting-basic-esp/README.md', 'reversin 2024-04-02 19:54:30 +00:00
README.md Translated ['exploiting/linux-exploiting-basic-esp/README.md', 'reversin 2024-04-02 19:54:30 +00:00

स्टैक कैनेरीज

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

स्टैकगार्ड और स्टैकशील्ड

स्टैकगार्ड एक विशेष मान जो एक कैनेरी के रूप में डालता है, ईआईपी (एक्सटेंडेड इंस्ट्रक्शन पॉइंटर) से पहले, विशेष रूप से 0x000aff0d (नल, न्यूलाइन, ईओएफ, कैरिज रिटर्न को प्रतिनिधित्व करता है) को बफर ओवरफ्लो के खिलाफ सुरक्षित रखने के लिए। हालांकि, recv(), memcpy(), read(), और bcopy() जैसे फ़ंक्शन अब भी संक्रमित हैं, और यह ईबीपी (बेस पॉइंटर) को सुरक्षित नहीं रखता है।

स्टैकशील्ड स्टैकगार्ड से एक अधिक विवेकपूर्ण दृष्टिकोण अपनाता है जिसमें एक ग्लोबल रिटर्न स्टैक बनाया गया है, जो सभी रिटर्न पतों (ईआईपी को) को संग्रहित करता है। यह सेटअप सुनिश्चित करता है कि कोई भी ओवरफ्लो हानि नहीं पहुंचाता है, क्योंकि यह संग्रहित और वास्तविक रिटर्न पतों के बीच तुलना करने की अनुमति देता है ताकि ओवरफ्लो घटनाएं पता लगाई जा सकें। इसके अतिरिक्त, स्टैकशील्ड स्टैकशील्ड को भी दुर्गम कर सकता है जैसे कि Return-to-libc, ROP (Return-Oriented Programming), या ret2ret जैसी तकनीकों के माध्यम से, इसका सुझाव देता है कि स्टैकशील्ड भी स्थानीय चरों को सुरक्षित नहीं रखता।

स्टैक स्मैश प्रोटेक्टर (ProPolice) -fstack-protector:

यह तंत्र ईबीपी के पहले एक कैनेरी रखता है, और स्थानीय चरों को पुनर्व्यवस्थित करता है ताकि बफर्स को अन्य चरों को ओवरराइट करने से बचाया जा सके। यह सुरक्षित रूप से तबादले को पुनर्व्यवस्थित करता है और इन प्रतियों को स्थानीय चरों के ऊपर स्थानांतरित करता है और इन प्रतियों का उपयोग तर्क के रूप में करता है। हालांकि, यह 8 तत्वों से कम आयात वाले सरणियों या उपयोगकर्ता की संरचना में बफर्स को सुरक्षित नहीं रखता।

कैनेरी एक यादृच्छिक संख्या है जो /dev/urandom से उत्पन्न होती है या एक डिफ़ॉल्ट मान 0xff0a0000 होता है। यह टीएलएस (सूत्र स्थानीय संग्रहण) में संग्रहीत होता है, जो धागे-स्थानीय स्थानों को धागे-विशिष्ट वैश्विक या स्थैतिक चरों के रूप में रखने की अनुमति देता है। ये चर आदिकों से पहले मूल प्रक्रिया से कॉपी किए जाते हैं, और बच्चे प्रक्रियाएँ अपने डेटा को परिवर्तित कर सकते हैं बिना माता-पिता या भाई-बहनों को प्रभावित किए। तथापि, यदि एक fork() का उपयोग किया जाता है बिना एक नया कैनेरी बनाए, तो सभी प्रक्रियाएँ (माता-पिता और बच्चे) एक ही कैनेरी को साझा करती हैं, जिससे यह विकल्पशील हो जाता है। i386 संरचना पर, कैनेरी gs:0x14 पर संग्रहित होती है, और x86_64 पर, fs:0x28 पर होती है।

यह स्थानीय सुरक्षा विधान उन फ़ंक्शनों की पहचान करता है जिनमें हमले के लिए संक्रमित बफर्स होते हैं और इन फ़ंक्शनों के शुरू में कैनेरी रखने के लिए कोड डालता है, और इनकी पूर्णता की पुष्टि के लिए अंत में कोड डालता है।

जब एक वेब सर्वर fork() का उपयोग करता है, तो यह एक ब्रूट-फोर्स हमला संभावना बनाता है कि कैनेरी बाइट को बाइट के रूप में अनुमान लगाया जा सकता है। हालांकि, fork() के बाद execve() का उपयोग करने से हमले को नकार दिया जा सकता है। vfork() बच्चे प्रक्रिया को डुप्लिकेशन किए बिना निष्पादित करने की अनुमति देता है जब तक वह लिखने का प्रयास नहीं करता, जिसके बाद एक डुप्लिकेट बनाया जाता है, प्रक्रिया निर्माण और मेमोरी हैंडलिंग के लिए एक विभिन्न दृष्टिकोण प्रदान करता है।

लंबाई

x64 बाइनरी में, कैनेरी कुकी एक 0x8 बाइट क्वॉर्ड है। पहले सात बाइट यादृच्छिक होते हैं और आखिरी बाइट एक नल बाइट होता है।

x86 बाइनरी में, कैनेरी कुकी एक 0x4 बाइट डवर्ड होती है। पहले तीन बाइट यादृच्छिक होते हैं और आखिरी बाइट एक नल बाइट होता है।

{% hint style="danger" %} दोनों कैनेरी की कम महत्वपूर्ण बाइट एक नल बाइट है क्योंकि यह निचले पतों से आने वाला पहला होगा और इसे पढ़ने से पहले स्ट्रिंग पढ़ने वाले फ़ंक्शन उसे पढ़ना बंद कर देंगे। {% endhint %}

बायपास

कैनेरी को लीक करना और फिर इसे ओवरराइट करना (उदाहरण के लिए, बफर ओवरफ्लो) अपने खुद के मान के साथ।

  • यदि कैनेरी बच्चे प्रक्रियाओं में फोर्क की गई है तो यह संभावना है कि इसे एक बाइट के रूप में ब्रूट-फोर्स किया जा सकता है:

{% content-ref url="bf-forked-stack-canaries.md" %} bf-forked-stack-canaries.md {% endcontent-ref %}

  • यदि बाइनरी में कोई दिलचस्प लीक या अर्बिट्रे रीड वलनरेबिलिटी है तो इसे लीक किया जा सकता है:

{% content-ref url="print-stack-canary.md" %} [print-stack-canary.md](print-stack-canary