Unsorted Bin Attack
मौलिक जानकारी
अनसॉर्टेड सूचियाँ अनसॉर्टेड_चंक्स (av)
के पते को चंक के bk
पते में लिखने की क्षमता रखती है। इसलिए, यदि एक हमलावर अनसॉर्टेड बिन के भीतर एक चंक में bk
प्वाइंटर का पता संशोधित कर सकता है, तो वह किसी भी पते में उस पते को लिख सकता है जो एक Glibc पता लीक करने या कुछ रक्षा को छलने में सहायक हो सकता है।
इसलिए, मौलिक रूप से यह हमला एक बड़ी संख्या को किसी भी पते पर सेट करने की अनुमति देता है। यह बड़ी संख्या एक पता है, जो एक हीप पता या एक Glibc पता हो सकता है। एक सामान्य लक्ष्य global_max_fast
है ताकि बड़े आकार के फास्ट बिन बिन्स बनाने की अनुमति हो (और एक अनसॉर्टेड बिन हमले से एक फास्ट बिन हमले में बदल सकते हैं)।
https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle में प्रदान किए गए उदाहरण पर एक नजर डालने और 0x400 और 0x500 की बजाय 0x4000 और 0x5000 का उपयोग करने से (Tcache से बचने के लिए) आप देख सकते हैं कि आजकल त्रुटि malloc(): unsorted double linked list corrupted
ट्रिगर होती है।
इसलिए, इस अनसॉर्टेड बिन हमले को अब (अन्य जांचों के बीच) डबल लिंक्ड सूची को ठीक करने की भी आवश्यकता है ताकि यह छलावा दिखाए victim->bk->fd == victim
या नहीं victim->fd == av (arena)
, जिसका अर्थ है कि हमें लिखना चाहिए पता जिस पते पर हम लिखना चाहते हैं, उसके fd
स्थान में नकली चंक का पता होना चाहिए और नकली चंक fd
एरियना की ओर प्वाइंट कर रहा हो।
ध्यान दें कि यह हमला अनसॉर्टेड बिन को क्षति पहुंचाता है (इसलिए छोटे और बड़े भी)। इसलिए हम अब केवल फास्ट बिन से आवंटन का उपयोग कर सकते हैं (एक अधिक जटिल कार्यक्रम अन्य आवंटन कर सकता है और क्रैश हो सकता है), और इसे ट्रिगर करने के लिए हमें एक ही आकार का आवंटन करना होगा या कार्यक्रम क्रैश हो जाएगा।
ध्यान दें कि global_max_fast
को अधिक लिखना इस मामले में सहायक हो सकता है, जिसमें भरोसा किया जा सकता है कि फास्ट बिन सभी अन्य आवंटन का ध्यान रखेगा जब तक उत्पादन पूरा नहीं हो जाता है।
गायिनाटक्सेडो के कोड से यह बहुत अच्छे से समझाता है, हालांकि यदि आप mallocs को इस प्रकार संशोधित करते हैं कि वे Tcache में समाप्त नहीं होते, तो आप देख सकते हैं कि पहले उल्लिखित त्रुटि आती है जो इस तकनीक को रोकती है: malloc(): unsorted double linked list corrupted
अनसॉर्टेड बिन इनफोलीक हमला
यह वास्तव में एक बहुत मौलिक अवधारणा है। अनसॉर्टेड बिन में चंक्स के पॉइंटर होते हैं। अनसॉर्टेड बिन में पहला चंक वास्तव में fd
और bk
लिंक्स मुख्य एरियना (Glibc) के एक हिस्से को पॉइंट करेगा।
इसलिए, यदि आप एक चंक को अनसॉर्टेड बिन में डाल सकते हैं और इसे पढ़ सकते हैं (उपयोग के बाद मुक्त करें) या इसे फिर से आवंटित कर सकते हैं बिना कम से कम 1 पॉइंटर को ओवरराइट किए तो फिर आपके पास एक Glibc इनफो लीक हो सकता है।
इस लिखन में एक हमला उपयोग किया गया था, जिसमें 4 चंक्स संरचना (A, B, C और D - D केवल शीर्ष चंक के साथ समेकन को रोकने के लिए) का दुरुपयोग किया गया था ताकि B में एक नल बाइट ओवरफ्लो किया गया था ताकि C इसका संकेत दे कि B अप्रयुक्त था। साथ ही, B में prev_size
डेटा संशोधित किया गया था ताकि आकार B का न होकर A+B हो।
फिर C को मुक्त किया गया, और A+B के साथ समेकित किया गया (लेकिन B अभी भी उपयोग में था)। A के आकार का एक नया चंक आवंटित किया गया और फिर लिब्सी लीक पते B में लिखा गया था जहां से वे लीक हो गए।
संदर्भ और अन्य उदाहरण
लक्ष्य एक वैश्विक चर को 4869 से अधिक मान से ओवरराइट करना है ताकि ध्वज मिल सके और PIE सक्षम नहीं है।
विचारणीय आकारों के चंक उत्पन्न किए जा सकते हैं और एक इच्छित आकार के हीप ओवरफ्लो है।
हमला तीन चंक बनाकर शुरू होता है: चंक0 ओवरफ्लो का दुरुपयोग करने के लिए, चंक1 ओवरफ्लो के लिए और चंक2 ताकि शीर्ष चंक पिछले वालों को समेकित न करें।
फिर, चंक1 को मुक्त किया गया और चंक0 को ओवरफ्लो किया गया ताकि चंक1 का
bk
पॉइंटर इस प्रकार पॉइंट करे:bk = magic - 0x10
फिर, चंक3 को चंक1 के आकार के साथ आवंटित किया जाता है, जो अनसॉर्टेड बिन हमला ट्रिगर करेगा और वैश्विक चर के मान को संशोधित करेगा, जिससे ध्वज प्राप्त करना संभव होगा।
[https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html](https://guyinatuxedo.github.io/31-unsorted 0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
यदि हम इस स्थान पर आकार 0x200 का एक तेज चंक प्राप्त कर लेते हैं, तो एक फ़ंक्शन पॉइंटर को ओवरराइट करना संभव होगा जो कार्यान्वित होगा
इसके लिए, आकार
0xfc
का एक नया चंक बनाया जाता है और मर्ज़ कार्य को उस पॉइंटर के साथ दो बार बुलाया जाता है, इस तरह हम तेज बिन में आकार0xfc*2 = 0x1f8
के एक छुट्टी हुई चंक का पॉइंटर प्राप्त करते हैं।फिर, इस चंक में संपादन कार्य को बुलाया जाता है ताकि इस तेज बिन का
fd
पता पिछले__free_hook
फ़ंक्शन की ओर इशारा करे।फिर, आकार
0x1f8
के एक चंक बनाया जाता है ताकि तेज बिन से पिछला अफ़ाल चंक प्राप्त किया जा सके ताकि एक और चंक आकार0x1f8
बनाया जा सके जिससे__free_hook
में एक तेज बिन चंक प्राप्त किया जा सके जिसेsystem
फ़ंक्शन का पता ओवरराइट किया जाता है।और अंत में
/bin/sh\x00
स्ट्रिंग को स्वतंत्र करने वाला एक चंक मुक्त किया जाता है, हटाने कार्य को बुलाया जाता है, जो__free_hook
फ़ंक्शन को ट्रिगर करता है जो/bin/sh\x00
के साथ सिस्टम को इशारा करता है।एक और उदाहरण एक 1B ओवरफ़्लो का दुरुपयोग करने का जो असंगठित बिन में चंकों को समेकित करने और फिर एक लिब्स इन्फोलीक प्राप्त करने और फिर एक वन गैजेट पता के साथ मैलोक हुक को ओवरराइट करने के लिए एक तेज बिन हमला है
हम केवल
0x100
से अधिक आकार के चंक आवंटित कर सकते हैं।एक असंगठित बिन हमला का उपयोग करके
global_max_fast
को ओवरराइट करें (ASLR के कारण 1/16 बार काम करता है, क्योंकि हमें 12 बिट संशोधित करने की आवश्यकता है, लेकिन हमें 16 बिट संशोधित करने की आवश्यकता है)।तेज बिन हमला एक ग्लोबल एरे को संशोधित करने के लिए। यह एक अर्बिट्रे रीड/राइट प्राइमिटिव देता है, जिससे हम GOT को संशोधित कर सकते हैं और किसी कार्य को
system
पर इशारा करने के लिए सेट कर सकते हैं।
Last updated