2012-09-04 11 views
5

मैं यह लेख पढ़ें: http://static.patater.com/gbaguy/day3pc.htmसीएस सेगमेंट रजिस्टर बदल दिया गया तो क्या होगा?

यह वाक्य

न करें कभी बदलें सीएस शामिल !!

लेकिन अगर आप CS सेगमेंट रजिस्टर संशोधित करते हैं तो वास्तव में क्या होगा? यह इतना खतरनाक क्यों है?

+2

'सीएस' = कोड सेगमेंट। मुझे लगता है कि इसे बदलना समकक्ष (कुछ अर्थ में) एक विकृत 'jmp' है। – valdo

+5

वह दस्तावेज़ काफी अविश्वसनीय लगता है: "कभी भी 'सीएस' बदलें' !!, लेकिन आप 'सीएस' को इस प्रकार पढ़ सकते हैं: 'mov ds, cs';' सीएस' का मान 'D'S में रखें।" खैर, x86 में 'mov ds, cs' और न ही कोई अन्य' mov segreg, segreg 'जैसे कोई निर्देश नहीं है। 'सीएस' के मूल्य को पढ़ने के लिए आप या तो 'mov reg, cs; mov ds, reg' (जहां 'reg'' ax', 'bx',' cx' आदि हो सकता है ...), या 'पुश सीएस; पॉप डीएस '। इसके अलावा, यदि आप कभी भी * सी * परिवर्तन नहीं करना चाहते हैं, तो सभी इंटरप्ट कॉल प्रश्न से बाहर हैं (उदाहरण के लिए BIOS, डॉस और लिनक्स सेवाएं)। http://web.itu.edu।tr/kesgin/mul06/intel/instr/mov.html – nrz

+1

@nrz: 'दूरदराज के सेवाओं' के माध्यम से सुलभ "लिनक्स सेवाएं" जैसी कोई चीज़ नहीं है (इंटरप्ट/सिस्को अलग-अलग काम करते हैं, भले ही इन्हें 'सीएस में बदलाव हो ', _caller_ यह नियंत्रित नहीं कर सकता कि वह लक्ष्य 'सीएस' क्या होगा, आईडीटी प्रविष्टियों/syscall msrs सेट करते समय ओएस द्वारा तय किया जाता है)। अन्य सभी के साथ ऐक, स्पष्ट रूप से 'cs' _can_ बदला जा सकता है, बस जब तक कि लक्ष्य कोड खंड मौजूद न हो और इस तरह से स्थापित किया जाए कि लक्ष्य 'ईआईपी' पहुंच योग्य है, ऐसी कोई भी कॉल' # जीपी 'गलती का कारण बन जाएगी और ऐप निरस्त हो जाएगा। –

उत्तर

7

cs कोड सेगमेंट है। cs:ip, जिसका अर्थ है csip (निर्देश सूचक) के साथ अगले निर्देश के स्थान पर इंगित करता है। तो cs या ip पर कोई भी परिवर्तन या दोनों पते को उस स्थान से बदलता है जहां से अगला निर्देश प्राप्त किया जाएगा और निष्पादित किया जाएगा।

आमतौर पर आप एक jmp (लंबी कूद) के साथ cs, call (लंबी कॉल) बदलने के लिए, retf, int3, int या iret। 8088 और 8086 pop cs में भी उपलब्ध है (ओपोड 0x0F)। pop cs 186+ में काम नहीं करेगा, जिसमें ओपोड 0x0F मल्टीबाइट निर्देशों के लिए आरक्षित है। http://en.wikipedia.org/wiki/X86_instruction_listings

लंबी कूद या लंबी कॉल में स्वाभाविक रूप से खतरनाक कुछ भी नहीं है। आपको सिर्फ यह जानना होगा कि आप कहां कूदते हैं या कॉल करते हैं और सुरक्षित मोड में आपको पर्याप्त निजीकरण करने की आवश्यकता होती है। 16-बिट वास्तविक मोड (उदाहरण के लिए डॉस) में आप कूद सकते हैं और जो भी पता चाहते हैं उसे कॉल कर सकते हैं, उदाहरण के लिए। jmp 0xF000:0xFFF0cs से 0xF000 और ip से 0xFFF0 पर सेट करता है, जो BIOS कोड का प्रारंभ पता है, और इस प्रकार कंप्यूटर को रीबूट करता है। अलग-अलग मेमोरी पतों में अलग-अलग कोड होते हैं और इस प्रकार विभिन्न प्रकार के परिणाम होते हैं, सिद्धांत में सबकुछ संभव हो सकता है (यदि आप हार्ड ड्राइव को स्वरूपित करने के लिए उपयोग किए गए BIOS कोड में कूदते हैं, वैध रजिस्टर और/या स्टैक मानों के साथ, तो हार्ड ड्राइव स्वरूपित की जाएगी 'के रूप में अनुरोध किया')। अभ्यास में jmp और call अधिकतर पते पर संभवतः अमान्य ओपोड या कुछ अन्य अपवाद (शून्य से विभाजित, ओवरफ्लो विभाजित आदि) में परिणामस्वरूप जल्द ही परिणाम मिलता है।

+0

केवल 'सीएस' बदलना गलत है। आम तौर पर या तो 'सीएस' और' xip' एक साथ बदल जाते हैं या बस 'xip' परिवर्तन होते हैं। –

+3

@AlexeyFrunze Well, 'ip' /' eip'/'rip' को बदलने/सेट किए बिना केवल 'सीएस' को बदलने का एकमात्र तरीका 'पॉप सीएस' है, जो केवल 8088 और 8086 में उपलब्ध है। 186+ में आप ' 'ip' /' eip'/'rip' को बदलने/सेट किए बिना' cs' को बदलें। 'pop cs' का उपयोग 8088/8086 (या 8088/8086 एमुलेटर) के लिए लक्षित obfuscation कोड में संभवतः किया जा सकता है। – nrz

0

संरक्षित मोड और लंबे मोड में (यानी 16-बिट मोड नहीं), सेग सहित सेगमेंट रजिस्ट्रार अब पते के अतिरिक्त 4 बिट्स नहीं हैं। वे खंड + सीमा (सामान्य आधार = 0 सीमा = 4 जीआईबी, यानी एक फ्लैट मेमोरी मॉडल) के साथ सेगमेंट डिस्क्रिप्टर की तालिका में इंडेक्स करते हैं, लेकिन अन्य विशेषताओं के साथ भी।

कोड सेगमेंट डिस्क्रिप्टर CPU मोड निर्धारित करता है (उदाहरण के लिए 32-बिट कंपैट मोड बनाम 64-बिट लंबा मोड)। 64-बिट कर्नेल पर, 64-बिट उपयोगकर्ता-स्थान प्रक्रिया कुछ 32-बिट कोड में far jmp बना सकती है। यह अभ्यास में उपयोगी नहीं है, और संदर्भ स्विच के बाद ओएस आपकी प्रक्रिया में लौटने पर भी तोड़ सकता है।

TODO: एक लिंक खोदें जहां किसी ने दिखाया कि यह कैसे करना है। मुझे लगता है कि इस बारे में एक विस्तृत उत्तर भी था कि सही सेगमेंट नंबरों को कैसे ढूंढें।

संबंधित मुद्दे