Stack Canaries

हैकट्रिक्स का समर्थन करें

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

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

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

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

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

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

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

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

लंबाई

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

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

दोनों कैनेरी की सबसे कम महत्वपूर्ण बाइट एक नल बाइट है क्योंकि यह निचले पतों से आने वाले स्टैक में पहला होगा और इसे पढ़ने से पहले स्ट्रिंग पढ़ने वाले फ़ंक्शन उसे पढ़ना बंद कर देंगे

बायपास

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

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

BF Forked & Threaded Stack Canaries
  • यदि बाइनरी में कोई लीक या अर्बिट्रेरी पढ़ने की कमी है तो इसे लीक करना संभव हो सकता है:

Print Stack Canary

[print-stack-canary.md](print-stack-can

संदर्भ

हैकट्रिक्स का समर्थन करें

Last updated