15-17 दिसंबर, 2012 को
PHDays CTF Quals नाम से योग्यता प्रतियोगिताओं
का आयोजन किया गया । 300 से अधिक टीमों ने PHDays III CTF प्रतियोगिता में भाग लेने के अधिकार के लिए लड़ाई लड़ी, जो मई 2013 में अंतरराष्ट्रीय मंच
PHDays III के हिस्से के रूप में आयोजित की जाएगी। पिछले दो महीनों में, हमारी टीम योग्यता प्रतियोगिताओं के लिए गहन रूप से विकास कार्य कर रही है, और हमने उनमें से एक - बाइनरी 500 के विश्लेषण के लिए इस लेख को समर्पित करने का निर्णय लिया है। यह आवेदन बहुत ही असामान्य है, इसलिए कोई भी टीम अपने आंतों में ध्वज को प्राप्त करने में सक्षम नहीं थी।
निष्पादन योग्य फ़ाइल हार्डवेयर वर्चुअलाइजेशन तकनीक (Intel VT-x) का उपयोग करके एक एमबीआर बूटकिट है। इस संबंध में, हमने तुरंत उपयोगकर्ताओं को चेतावनी दी कि एप्लिकेशन सिस्टम को नुकसान पहुंचा सकता है, और यह कि इसे वर्चुअल मशीन या एमुलेटर पर चलाने की आवश्यकता है।
चेतावनी और लाइसेंस समझौता ड्रॉपर
आइए कंप्यूटर पर कार्य सेट करने वाले ड्रॉपर की समीक्षा के साथ शुरू करें। इस मॉड्यूल का मुख्य कार्य काफी तुच्छ है। इसमें संसाधन अनुभाग से निकाली गई फ़ाइलों को एक स्व-निर्मित छिपी हुई फ़ाइल सिस्टम में लिखने के साथ-साथ मूल बूटलोडर (एमबीआर) को अपने स्वयं के साथ लिखना शामिल है। इसके अलावा, ड्रॉपर मूल एमबीआर की एक प्रति बनाता है और इसे फ़ाइल सिस्टम में सहेजता है।
मॉड्यूल कई तकनीकों का उपयोग करता है जो इसके विश्लेषण को जटिल करते हैं। सबसे पहले, यह एसटीएल, ओओपी और आभासी कार्यों का उपयोग करके सी ++ में लिखा गया है। इसलिए, सभी फ़ंक्शन कॉल निहित हैं और वर्चुअल विधि तालिकाओं का उपयोग करते हैं।

आईडीए प्रो में वर्चुअल मेथड कॉलदूसरा दृष्टिकोण, जो इस फ़ाइल के विश्लेषण को जटिल करता है, फ़ाइलों को पढ़ और लिख रहा है। हार्ड ड्राइव के साथ सभी संचालन सीधे SCSI नियंत्रक के माध्यम से किए जाते हैं। मानक ReadFile / WriteFile को कॉल करने के बजाय, हमने SCI_PASS_THROUGH_DIRECT नियंत्रण कोड के साथ DeviceIoControl फ़ंक्शन का उपयोग किया, जो आपको निचले स्तर पर हार्ड ड्राइव के साथ सहभागिता करने की अनुमति देता है।
इसके अलावा, संसाधनों में स्थित सभी फ़ाइलों को 256-बिट कुंजी का उपयोग करके एन्क्रिप्ट किया गया है।
अब चलो छिपे हुए फ़ाइल सिस्टम के विवरण पर चलते हैं। इसकी संरचना काफी सरल है। सिस्टम की वृद्धि अंत से होती है और हार्ड ड्राइव के अंत से पहले 2 क्षेत्रों को दर्ज किया जाता है। पहले DWORD में फ़ाइल सिस्टम में फ़ाइलों की संख्या होती है, जो XOR ऑपरेशन द्वारा निरंतर 0x8FC54ED2 के साथ फोल्ड की जाती है। फ़ाइलों के विवरण के साथ निर्देशिका है:
struct MiniFsFileEntry { DWORD fileIndex; DWORD fileOffset; DWORD fileSize; };
एक फ़ाइल इंडेक्स कुछ स्थिर है जो फ़ाइल सिस्टम (एक नाम के बजाय) में दी गई फ़ाइल का प्रतिनिधित्व करता है। फ़ाइल में ऑफसेट फाइल सिस्टम की शुरुआत के सापेक्ष बाइट्स में मापा जाता है।
MiniFs फ़ाइल सिस्टम संरचनाएमबीआर
ड्रॉपर ने अपना काम पूरा करने के बाद, यह स्पष्ट हो जाता है कि ऑपरेटिंग सिस्टम में हमारे पास करने के लिए अधिक कुछ नहीं है, हमें संशोधित बूट रिकॉर्ड को रिबूट और डीबग करने की आवश्यकता है। MBR को डीबग करने के कई तरीके हैं। बेशक, यह एक हार्डवेयर डिबगर का उपयोग करके एक वास्तविक मशीन पर किया जा सकता है, लेकिन यह असुविधाजनक और महंगा है। इस संबंध में, हम सुझाव देते हैं कि VMWare वर्चुअल मशीन का उपयोग करें (आपको वर्चुअल मशीन के लिए कुछ सेटिंग्स को पंजीकृत करने की आवश्यकता है) इसे GDB डीबगर से कनेक्ट करके (इस विधि में महत्वपूर्ण कमियां हैं, जिसे बाद में वर्णित किया जाएगा), या Boch Emulator। इन दो विधियों का लाभ यह है कि आप आईडीए प्रो डीबगर का उपयोग करके विश्लेषण कर सकते हैं। यह बहुत सुविधाजनक है, हालांकि यहां हमें बड़ी समस्याओं का सामना करना पड़ रहा है।
यह पता लगाने के बाद कि हम इस कोड को किस टूल से डीबग कर सकते हैं, हम व्यापार में उतर जाते हैं एमबीआर का पहला भाग बहुत सरल है, और इसके विश्लेषण से कोई समस्या नहीं होनी चाहिए। केवल एक चीज जो वह करती है, वह हमारे MBR (विस्तारित MBR) के दूसरे भाग को BIOS के 0x42 फ़ंक्शन को 0x13 हैंडलर को कॉल करके हार्ड डिस्क से पढ़ती है और इसे 0x7e00 (तुरंत बूटलोडर के पहले भाग के बाद) में लिखती है। यह क्रिया आवश्यक है क्योंकि BIOS केवल बूटलोडर के 512 बाइट्स को मेमोरी में कॉपी करता है, और हमारा कोड इस आकार से अधिक है।
बूटलोडर के विस्तारित हिस्से पर एक बार, एक अनुभवी विशेषज्ञ को तुरंत संदेह होगा कि कुछ गलत है, अर्थात् बूटलोडर को बाधित किया गया है।
आईडीए प्रो विश्लेषण के साथ बूटलोडर स्रोतों की तुलना करनाऑबफसकेशन की पूरी जटिलता फ़ंक्शन कॉल है, क्योंकि वे अंतर्निहित रूप से होते हैं। बहुत शुरुआत से, फ़ंक्शन का पता जो एक विशेष तालिका में कॉल फ़ंक्शन को खोजता है, इस तालिका फ़ील्ड के सापेक्ष फ़ंक्शन इंडेक्स (दो-बाइट निरंतर) की तुलना में एक्सएक्स रजिस्टर में दर्ज किया जाता है। यह फ़ंक्शन रिटर्न एड्रेस लेता है और WORD को पढ़ता है, जो फ़ंक्शन के सूचकांक के लिए जिम्मेदार है। अगला, ऑफ़सेट तालिका में खोजा जाता है और नियंत्रण इस फ़ंक्शन में स्थानांतरित किया जाता है। बहुत अंत में, नियत फ़ंक्शन के सूचकांक (रिटर्न एड्रेस + 2) के साथ एक निरंतर के लिए नियंत्रण लौटाता है।
MBR में फ़ंक्शन तालिका
एमबीआर ऑबफसिकेशन एल्गोरिथम का योजनाबद्ध प्रतिनिधित्वबूट सेक्टर कोड अपने आप में काफी सरल है:
- हार्ड ड्राइव पैरामीटर प्राप्त करना;
- मेमोरी में एक छिपे हुए फ़ाइल सिस्टम से मूल बूट रिकॉर्ड पढ़ना;
- 0x7c00 पर मूल के साथ हमारे बूट रिकॉर्ड को बदलना;
- फाइल सिस्टम से पढ़ना और हाइपरविजर लोडर को डिक्रिप्ट करना;
- फाइल सिस्टम से पढ़ना और हाइपरविजर के शरीर को डिकोड करना;
- पैरामीटर्स लोडर को नियंत्रण पैरामीटर तैयार करना और नियंत्रण स्थानांतरित करना।
यह उल्लेखनीय है कि बूक्स एमुलेटर के BIOS से बाइट्स का एक सेट बूटलोडर और हाइपरविजर के शरीर को एन्क्रिप्ट करने के लिए उपयोग किया गया था। इस प्रकार, इस एमुलेटर के लिए कार्य तेज हो गया। ऐसा कई कारणों से किया गया है। सबसे पहले, इंटेल वीटी-एक्स हार्डवेयर वर्चुअलाइजेशन का डीबगिंग केवल एक वास्तविक मशीन या बोच पर (संस्करण 2.4.5 के बाद से) संभव है। PHDays CTF Quals के ढांचे में पहली विधि बहुत कठिन है। इस प्रकार, शुरू से ही हम इस एमुलेटर के उपयोग से बंधे थे। दूसरे, हम नहीं चाहते थे कि इस कार्य की जाँच केवल स्थैतिक विश्लेषण की सहायता से की जाए, इसलिए यह निर्णय लिया गया कि BIOS से कुंजी का उपयोग करके एन्क्रिप्शन खिलाड़ियों को गतिशील विश्लेषण का उपयोग करने के लिए बाध्य करेगा। तीसरा, हमने इसे सुरक्षित रूप से चलाने का फैसला किया: यदि प्रोग्राम को गलती से एक वास्तविक मशीन पर लॉन्च किया गया था, तो बूटलोडर को डिक्रिप्ट नहीं किया जाएगा, और नियंत्रण को मूल बूट रिकॉर्ड में स्थानांतरित कर दिया जाएगा, जो सिस्टम को नुकसान नहीं पहुंचाएगा।
खिलाड़ियों के काम को सुविधाजनक बनाने के लिए, हमने पहले जानकारी पोस्ट की है कि उन कार्यों में से एक को हल करने के लिए उन्हें बोच असेंबली की आवश्यकता होगी, साथ ही साथ ऑपरेटिंग सिस्टम की कार्य छवि भी।
हाइपरवाइजर लोडर
हार्डवेयर वर्चुअलाइजेशन आज एक नई अवधारणा नहीं है। यह 2006-2007 में व्यापक रूप से उपयोग किया गया था, जब एएमडी और इंटेल वर्कस्टेशंस के बाजार में सबसे प्रसिद्ध प्रोसेसर के निर्माताओं ने उन प्रोसेसर का उत्पादन करना शुरू किया जो संबंधित कार्यों का समर्थन करते हैं। वर्चुअल मशीन मॉनिटर (उर्फ हाइपरवाइजर) के बारे में अधिक जानकारी अगले भाग में चर्चा की जाएगी। यह अनुभाग एक परीक्षण प्रणाली पर हार्डवेयर वर्चुअलाइजेशन की संक्षिप्त समीक्षा करेगा।
जैसा कि पहले उल्लेख किया गया है, इंटेल वीटी-एक्स हार्डवेयर वर्चुअलाइजेशन का उपयोग करके एक एप्लिकेशन को डीबग करना केवल एक वास्तविक मशीन पर या एक बोक्स एमुलेटर (संस्करण 2.4.5 से शुरू) पर किया जा सकता है, लेकिन समस्याएं खत्म नहीं होती हैं। मानक एमुलेटर विधानसभा हार्डवेयर वर्चुअलाइजेशन का समर्थन नहीं करता है। यही कारण है कि हमने
बोच की एक
विशेष असेंबली को संकलित किया, जिसका एक लिंक हमने असाइनमेंट के पहले क्लू में दिया था।
हाइपरविजर लोडर का मुख्य कार्य हाइपरविजर के शरीर को पहले मेगाबाइट से ऊपर ले जाना और उस पर नियंत्रण स्थानांतरित करना है। हालांकि, रास्ते में, वह कई गैर-तुच्छ कार्यों को करता है, जो अलग से चर्चा करने लायक हैं।
हाइपरविजर लोडर इनपुट के रूप में कई मापदंडों को स्वीकार करता है। उनमें से वह पता है जिस पर इसे डाउनलोड किया गया था। इस पते का उपयोग कोड सेगमेंट के लिए आधार के रूप में किया जाता है, जो कि दूर की छलांग द्वारा निर्धारित होता है।
इसके अलावा, सीपीयूआईडी अनुदेश यह जांचता है कि कोड इंटेल सिस्टम (फ़ंक्शन 0) पर निष्पादित किया गया है, और यह सिस्टम हार्डवेयर वर्चुअलाइजेशन (फ़ंक्शन 1) का समर्थन करता है। चेक निम्नानुसार आगे बढ़ता है: यदि, जब CPUID कहा जाता है, EAX रजिस्टर में मूल्य 1 होता है, तो VMX ध्वज ECX रजिस्टर के बिट 5 में आउटपुट पर होगा। यदि ध्वज सेट है, तो वर्चुअलाइजेशन का समर्थन किया जाता है। यह जांचने के लिए कि क्या बूटिंग (BIOS) के शुरुआती चरणों में वर्चुअलाइजेशन अवरुद्ध है, आपको MSR रजिस्टर नंबर 0x3A पढ़ना होगा। यदि EAX रजिस्टर में RDMSR इंस्ट्रक्शन का आउटपुट बिट 0 पर सेट हो जाता है और बिट 2 पर रीसेट हो जाता है, तो वर्चुअलाइजेशन ब्लॉक हो जाता है।
अगले चरण में, सिस्टम मेमोरी कार्ड को पढ़ने का कार्य कहा जाता है। यह EAX रजिस्टर में पैरामीटर 0xE820 के साथ अवरोध चक्र 0x15 में कॉल करके प्राप्त किया जाता है। इस मामले में, बफर मेमोरी क्षेत्रों का वर्णन करने वाले रिकॉर्ड का एक सेट संग्रहीत करता है: आधार, लंबाई, प्रकार, अतिरिक्त प्रकार (यदि BIOS समर्थित है)। इसके अलावा, परिणामी नक्शे की निगरानी शरीर के लिए मुफ्त मेमोरी के एक टुकड़े की उपस्थिति के लिए की जाती है। मॉनिटर स्वयं वर्तमान में लगभग 20KB स्थान रखता है, लेकिन 2MB सहेजा जाता है (मेमोरी के साथ काम करने की सुविधा के लिए)। यदि इस तरह की मेमोरी मिलती है, तो इसे व्यस्त के रूप में चिह्नित किया जाता है।
पहली मेगाबाइट के ऊपर मॉनिटर बॉडी को स्थानांतरित करने के लिए, ऑपरेशन के वास्तविक मोड से संरक्षित या लंबे समय तक स्विच करना आवश्यक है। चूंकि भविष्य में मॉनिटर को लंबे मोड में काम करना चाहिए (प्रलेखन कहता है कि मॉनिटर संरक्षित मोड में रह सकता है, लेकिन इसमें बहुत अधिक बिंदु नहीं है), लंबे मोड में संक्रमण होता है। ऐसा करने के लिए, कई शर्तों को पूरा किया जाना चाहिए: पृष्ठ संरचनाएं तैयार करें (पीएमएल 4, पीडीपीटी, 2 एमबी पृष्ठों के लिए पीडी की एक निश्चित संख्या), सीआर 4 रजिस्टर में पीएई बिट मुर्गा, सीआर 3 रजिस्टर में पीएमएल 4 तालिका का पता लिखें, जीडीटीआर को लंबी मोड खंडों के विवरणकों के साथ सेट करें, एलएमए बिट को हल करें। रजिस्टर में CRR0 में MSR EFER, मुर्गा बिट्स PG और PE रजिस्टर करें। यदि इसके बाद भी आप लंबी दूरी के संक्रमण निर्देश को निष्पादित करते हैं, तो आप वास्तविक मोड से लंबी मोड में स्विच करेंगे।
यह देखा गया कि BoAs एमुलेटर के साथ IDA 6.1 डिस्सेम्बलर सही ढंग से काम नहीं करता है और लॉन्ग मोड पर स्विच करने के बाद अजीब मान देने लगता है (IDA 6.3 में यह त्रुटि ठीक हो गई है)। शायद वह स्वतंत्र रूप से रजिस्टरों के मूल्यों की गणना करता है और उपयुक्त सेवाओं के लिए बोच से संपर्क नहीं करता है। हालांकि, वह वास्तविक मोड से लंबे समय तक प्रत्यक्ष स्विचिंग को सही ढंग से संभालने में सक्षम नहीं है।
अगला, हाइपरविजर को गंतव्य पते पर कॉपी किया जाता है, और नियंत्रण इसे स्थानांतरित कर दिया जाता है।
हाइपरविजर
विशेष रूप से इस कार्य के लिए, एक पतली हाइपरवाइज़र लिखा गया था, जो:
- VMX रूट मोड में प्रवेश करता है
- 0x7C00 पते से वास्तविक मोड में अतिथि प्रणाली शुरू करने के लिए VMCS संरचना को कॉन्फ़िगर करता है;
- अतिथि निकास हैंडलर स्थापित करता है;
- VMLAUNCH निर्देश के साथ अतिथि शुरू करता है।
इस कोड के शोधकर्ता के सामने मुख्य कार्य उस पते का पता लगाना है जिससे अतिथि सिस्टम से बाहर निकलने वाले प्रोसेसर लॉन्च किए जाते हैं।
झंडा
वर्चुअल मशीन के आउटपुट प्रोसेसर तक पहुंचने के बाद, प्रतिभागी फिनिश लाइन पर चला गया, और प्रतिष्ठित ध्वज प्राप्त करने से पहले, यह एक छोटी सी समस्या को हल करने के लिए बना रहा।
हैंडलर कोड से यह देखना आसान है कि यदि सीपीयूआईडी अनुदेश के अनुसार एक निकास बनाया गया था, और ईआईपी रजिस्टर एक निश्चित मूल्य है, तो कुछ घटना का प्रसंस्करण शुरू होता है। रजिस्टर EAX, ECX, EDX, EBX, ESI, EDI, ESP और EBP के मानों से, वेक्टर भरा हुआ है (32 बाइट्स), और फिर इस वेक्टर की वैधता की जाँच की जाती है। चेक में वेक्टर (x_0, ..., x_31) को निम्नलिखित रूप के समीकरणों की प्रणाली में प्रतिस्थापित किया जाता है:

यदि समानता रखती है, तो दर्ज वेक्टर सही है और बफर को डिक्रिप्ट करने के लिए एक कुंजी के रूप में उपयोग किया जाता है। इस प्रकार, खिलाड़ी को 32 अज्ञात के साथ 32 समीकरणों के समीकरणों की एक प्रणाली को हल करने और एक एन्क्रिप्शन कुंजी प्राप्त करने की आवश्यकता है। इस जाँच की एकमात्र जटिलता यह है कि यह गणितीय सहसंसाधक (FPU) के निर्देशों का उपयोग करते हुए लिखा गया है।
एन्क्रिप्टेड बफर में एक और एमबीआर है, जिसमें झंडा स्पष्ट है। ऐसा बूटलोडर मूल के स्थान पर पंजीकृत होता है, और एक मजबूर रिबूट को कहा जाता है, जिसके बाद एमबीआर स्क्रीन पर एक ध्वज प्रदर्शित करता है।
प्रदर्शित ध्वज उदाहरणपरीक्षण आवेदन
विशेष रूप से परीक्षण के लिए, हमने एक छोटा सा आवेदन लिखा है जो किसी दिए गए पते पर मेमोरी आवंटित करता है, आवश्यक ऑफ़सेट पर सीपीयूआईडी कमांड (ईआईपी रजिस्टर के पते + ऑफसेट = आवश्यक मूल्य) और कुछ और निर्देश लिखता है, सामान्य रजिस्टरों को आवश्यक मानों से भरता है और वांछित पते पर नियंत्रण स्थानांतरित करता है। इस प्रकार, जब सीपीयूआईडी अनुदेश निष्पादित किया जाता है, तो हाइपरवाइजर नियंत्रण लेता है, झंडे की जांच करता है, और सिस्टम को रीबूट करता है, स्क्रीन पर ध्वज प्रदर्शित करता है।
नमूना परीक्षण कार्यक्रमनिष्कर्ष
इस एप्लिकेशन को बनाते हुए, हम कुछ गैर-मानक विकसित करना चाहते थे, एक ऐसा कार्यक्रम जो किसी टीम में विश्लेषण करने के लिए दिलचस्प होगा, क्योंकि इस कार्य को हल करने के लिए, आपको Win32 अनुप्रयोगों के रिवर्स विश्लेषण, बूटलोडर के विश्लेषण, वास्तविक प्रोसेसर मोड में काम करने, मोटापे और एन्क्रिप्शन के सिद्धांतों का विश्लेषण करने की आवश्यकता है। इसे हल करने के लिए, स्थैतिक और गतिशील विश्लेषण दोनों को संयोजित करना आवश्यक है, साथ ही साथ हार्डवेयर वर्चुअलाइजेशन, कोडांतरक x86-64 के मूल सिद्धांतों का अध्ययन करना और ध्वज प्राप्त करने के लिए प्रारंभिक गणितीय ज्ञान को लागू करना आवश्यक है।
हमें पूरी उम्मीद है कि हम दोनों प्रतिभागियों और इस समीक्षा को पढ़ने वालों में रुचि रखने में कामयाब रहे!
लेखकों से
हमने क्वालिफाइंग प्रतियोगिताओं की शुरुआत से तीन सप्ताह पहले इस कार्य को लिखने का फैसला किया और सुनिश्चित किया गया कि हम इसे जल्दी से पूरा कर लेंगे, लेकिन सब कुछ बहुत अप्रत्याशित हो गया। हमने क्वालीफाइंग प्रतियोगिताओं की शुरुआत से कुछ घंटे पहले यह कार्य पारित किया था, इसके परीक्षण का समय नहीं था। प्रसव के समय, हम केवल यह सुनिश्चित कर रहे थे कि प्रतिभागियों को ध्वज प्राप्त करने का अवसर मिले। हालांकि, वर्चुअल वातावरण में शुरू हुई एक प्रणाली ने लगातार त्रुटियों को फेंक दिया और समय-समय पर मौत की नीली स्क्रीन में दुर्घटनाग्रस्त हो गई, जिसके बाद उसने बूट करने से इनकार कर दिया। इस लेख को लिखने के समय, हमारे पास कई कमियों को ठीक करने और कार्य का अधिक स्थिर संस्करण बनाने के लिए अधिक समय नहीं था। फिर भी, ओएस को पूरी तरह से स्थिर करने के लिए पर्याप्त समय नहीं था, इसलिए हम कार्य का एक नया संस्करण साझा कर रहे हैं, साथ ही साथ एक वीडियो, कार्य के कार्य और परीक्षण कार्यक्रम का प्रदर्शन कर रहे हैं। आप सभी को धन्यवाद!
कार्य के साथ पुरालेखवीडियोग्रिगोरीव मैक्सिम ( स्लिम_ड0 जी ), सर्गेई कोवालेव
अनुसंधान केंद्र सकारात्मक अनुसंधान