First Fit

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

पहला फिट

जब आप glibc का उपयोग करके किसी प्रोग्राम में मेमोरी को मुक्त करते हैं, तो मेमोरी चंक्स को प्रबंधित करने के लिए विभिन्न "बिन" का उपयोग किया जाता है। यहाँ दो सामान्य स्थितियों का सरलीकृत विवरण है: अनक्रमित बिन्स और फास्टबिन्स।

अनक्रमित बिन्स

जब आप एक मेमोरी चंक को मुक्त करते हैं जो एक तेज चंक नहीं है, तो यह अनक्रमित बिन में जाता है। यह बिन एक सूची की तरह काम करता है जहाँ नए मुक्त चंक्स को सिरे (शीर्ष) में जोड़ा जाता है। जब आप नई मेमोरी चंक का अनुरोध करते हैं, तो आवंटक उस अनक्रमित बिन की ओर देखता है पीछे से (पूंछ) ताकि एक चंक ढूंढ सके जो पर्याप्त बड़ा हो। अगर अनक्रमित बिन से एक चंक आपकी आवश्यकता से अधिक बड़ा है, तो उसे विभाजित किया जाता है, जिसमें सिरा वापस किया जाता है और बिन में बचा हुआ हिस्सा रहता है।

उदाहरण:

  • आप 300 बाइट (a) का आवंटन करते हैं, फिर 250 बाइट (b) का, फिर a को मुक्त करते हैं और फिर से 250 बाइट (c) का अनुरोध करते हैं।

  • जब आप a को मुक्त करते हैं, तो यह अनक्रमित बिन में जाता है।

  • अगर फिर से 250 बाइट का अनुरोध किया जाता है, तो आवंटक a को पूंछ पर पाता है और उसे विभाजित करता है, जो आपके अनुरोध के लिए फिट होने वाला हिस्सा वापस करता है और बचा हुआ हिस्सा बिन में रहता है।

  • c पिछले a की ओर इशारा करेगा और a के साथ भरा होगा।

char *a = malloc(300);
char *b = malloc(250);
free(a);
char *c = malloc(250);

फास्टबिन्स

फास्टबिन्स छोटे मेमोरी चंक के लिए उपयोग किए जाते हैं। अनसॉर्टेड बिन्स की तरह, फास्टबिन्स नए चंक को हेड में जोड़ते हैं, जिससे एक लास्ट-इन-फर्स्ट-आउट (LIFO) व्यवहार बनता है। अगर आप मेमोरी का एक छोटा चंक अनुरोध करते हैं, तो एलोकेटर फास्टबिन के हेड से खींचेगा।

उदाहरण:

  • आप चार चंक्स आवंटित करते हैं, प्रत्येक 20 बाइट के (a, b, c, d).

  • जब आप उन्हें किसी भी क्रम में फ्री करते हैं, तो फ्री किए गए चंक्स फास्टबिन के हेड में जोड़ दिए जाते हैं।

  • अगर फिर आप 20 बाइट का चंक अनुरोध करते हैं, तो एलोकेटर फास्टबिन के हेड से सबसे हाल ही में फ्री किए गए चंक को वापस करेगा।

char *a = malloc(20);
char *b = malloc(20);
char *c = malloc(20);
char *d = malloc(20);
free(a);
free(b);
free(c);
free(d);
a = malloc(20);   // d
b = malloc(20);   // c
c = malloc(20);   // b
d = malloc(20);   // a

अन्य संदर्भ और उदाहरण

  • ARM64. Use after free: एक उपयोगकर्ता ऑब्जेक्ट उत्पन्न करें, इसे मुक्त करें, एक ऑब्जेक्ट उत्पन्न करें जो मुक्त चंक को प्राप्त करता है और उसमें लिखने की अनुमति देता है, पिछले वाले से उपयोगकर्ता->पासवर्ड की स्थिति को अधिलेखित करें। पासवर्ड जांच को छलना करने के लिए उपयोगकर्ता को पुनः पुनः उपयोग करें

  • प्रोग्राम नोट्स बनाने की अनुमति देता है। एक नोट में नोट जानकारी होगी जो malloc(8) में होगी (जिसमें एक फ़ंक्शन के पॉइंटर हो सकता है जो कॉल किया जा सकता है) और नोट की सामग्री के लिए एक और malloc(<size>) के लिए पॉइंटर होगा।

  • हमला यह होगा कि 2 नोट्स (नोट0 और नोट1) बनाएं जिनमें नोट जानकारी आकार से बड़ी malloc सामग्री होगी और फिर उन्हें मुक्त करें ताकि वे तेज बिन (या टीकैश) में आ जाएं।

  • फिर, एक और नोट (नोट2) बनाएं जिसका आकार 8 हो। सामग्री नोट1 में होगी क्योंकि चंक पुनः उपयोग किया जाएगा, जहां हम फ़ंक्शन पॉइंटर को जीत फ़ंक्शन की ओर पहुंचाने के लिए संशोधित कर सकते हैं और फिर Use-After-Free नोट1 को नए फ़ंक्शन पॉइंटर को कॉल करने के लिए।

  • कुछ मेमोरी को आवंटित करना संभव है, वांछित मान लिखना, इसे मुक्त करना, पुनः आवंटित करना और क्योंकि पिछला डेटा अब भी वहाँ है, इसे नए अपेक्षित स्ट्रक्चर में चंक में सेट करने की संभावना बनाता है ताकि मूल्य सेट करने या झंडा प्राप्त करने की संभावना हो।

  • इस मामले में एक विशिष्ट चंक में 4 लिखने की आवश्यकता है जो पहला आवंटित होने वाला है (यहां तक कि सभी को मजबूर करके मुक्त करने के बाद भी)। प्रत्येक नए आवंटित चंक पर इसकी संख्या सरणी सूचक में संग्रहीत की जाती है। फिर, 4 चंक्स आवंटित करें (+ पहले आवंटित), आखिरी वाला में 4 होगा, उन्हें मुक्त करें और पहले आवंटित का पुनः आवंटन करने के लिए मजबूर करें, जो आखिरी चंक का उपयोग करेगा जिसमें 4 है।

Last updated