5

मैंने आईओएस टैग शामिल किया, लेकिन मैं कोर i7 मैकबुक प्रो (x86-64, दाएं?) पर सिम्युलेटर में चल रहा हूं, इसलिए मुझे लगता है कि यह असीमित है।सामान्य प्रयोजन रजिस्टर की सामग्री में क्या शामिल है?

मैं वर्तमान में फ्लोरी के वीडियो विज्ञापनों में एक क्रैश को डिबग कर रहा हूं। मेरे पास उद्देश्य-सी अपवादों पर एक ब्रेकपॉइंट सेट है। जब ब्रेकपॉइंट मारा जाता है तो मैं objc_msgSend में हूं। कॉलस्टैक में निजी फ़्लोरी और आईओएस विधियों का मिश्रण होता है, कुछ भी सार्वजनिक नहीं है और मैंने जो भी लिखा है। objc_msgSend स्टैक फ्रेम आउटपुट से register read कॉलिंग निम्नलिखित:

(lldb) register read 
General Purpose Registers: 
     eax = 0x1ac082d0 
     ebx = 0x009600b5 "spaceWillDismiss:interstitial:" 
     ecx = 0x03e2cddb "makeKeyAndVisible" 
     edx = 0x0000003f 
     edi = 0x0097c6f3 "removeWindow" 
     esi = 0x00781e65 App`-[FlurryAdViewController removeWindow] + 12 
     ebp = 0xbfffd608 
     esp = 0xbfffd5e8 
     ss = 0x00000023 
    eflags = 0x00010202 App`-[FeedTableCell setupVisibleCommentAndLike] + 1778 at FeedTableCell.m:424 
     eip = 0x049bd09b libobjc.A.dylib`objc_msgSend + 15 
     cs = 0x0000001b 
     ds = 0x00000023 
     es = 0x00000023 
     fs = 0x00000000 
     gs = 0x0000000f 

मैं इस उत्पादन के बारे में कुछ प्रश्न हैं।

  • मुझे लगता है कि $ ebx में चयनकर्ता शामिल है जो क्रैश और $ edi अंतिम निष्पादन विधि है। क्या यह मामला है?
  • $ ईआईपी है जहां मैं दुर्घटनाग्रस्त हो गया। क्या वह आमतौर पर मामला है?
  • $ eflags एक उदाहरण विधि का संदर्भ देता है, जहां तक ​​मुझे पता है, इस दुर्घटना से कोई लेना देना नहीं है। वो क्या है?
  • क्या कोई अन्य जानकारी है जो मैं इन रजिस्टरों से बाहर निकल सकता हूं?

उत्तर

1

मैं विशेष रूप से आईओएस/उद्देश्य-सी फ्रेम लेआउट से बात नहीं कर सकता, इसलिए मैं ईबीएक्स और ईडीआई के बारे में आपके प्रश्न का उत्तर नहीं दे सकता। लेकिन मैं ईआईपी और ईएफएलजीएस के संबंध में आपकी मदद कर सकता हूं और आपको ईएसपी/ईबीपी और चयनकर्ता रजिस्टरों के बारे में कुछ सामान्य संकेत देता हूं। (वैसे, सिम्युलेटर एक 32-बिट x86 वातावरण का अनुकरण है, आप बता सकते हैं क्योंकि आपके रजिस्टरों 32 बिट्स लंबे होते हैं।)

EIP instruction pointer रजिस्टर, भी कार्यक्रम काउंटर रूप में जाना जाता है, जो होता है वर्तमान में निष्पादित मशीन निर्देश का पता। इस प्रकार यह इंगित करेगा कि आपका प्रोग्राम क्रैश हो गया है, या अधिक आम तौर पर, जहां आपका प्रोग्राम ब्रेकपॉइंट हिट करता है, डंप कोर इत्यादि।

ईआईपी सहेजा गया है और फ़ंक्शन कॉल को लागू करने के लिए पुनर्स्थापित किया गया है (मशीन कोड स्तर पर - इनलाइनिंग परिणामस्वरूप उच्च स्तरीय भाषा कॉल वास्तविक कॉल नहीं कर सकती हैं)। स्मृति-असुरक्षित भाषाओं में, एक स्टैक बफर ओवरफ़्लो निर्देश सूचक के सहेजे गए मान को ओवरराइट कर सकता है, जिससे वापसी निर्देश गलत स्थान पर लौटने के लिए होता है। यदि आप भाग्यशाली हैं, तो अधिलेखित मूल्य अगली मेमोरी फ़ेच पर एक सेगफॉल्ट ट्रिगर करेगा, लेकिन समस्या को डीबग करने में ईआईपी का मूल्य मनमानी और अनुपयोगी होगा। यदि आप दुर्भाग्यपूर्ण हैं, तो एक हमलावर ने उपयोगी कोड को इंगित करने के लिए नए ईआईपी तैयार किए हैं, इसलिए कई वातावरण सहेजे गए/ओवरराइट किए गए ईआईपी को बहाल करने से पहले इन ओवरराइट्स का पता लगाने के लिए "स्टैक कुकीज़" या "कैनरी" का उपयोग करते हैं, इस मामले में ईआईपी मान हो सकता है उपयोगी।

EFLAGS एक स्मृति पता नहीं है, और तर्कसंगत रूप से एक सामान्य उद्देश्य रजिस्टर नहीं है। EFLAGS का प्रत्येक बिट एक ध्वज है जिसे विभिन्न निर्देशों द्वारा सेट या परीक्षण किया जा सकता है। सबसे महत्वपूर्ण झंडे वाहक, शून्य और साइन झंडे हैं, जो अंकगणितीय निर्देशों द्वारा निर्धारित होते हैं और सशर्त शाखाओं के लिए उपयोग किए जाते हैं। आपका डीबगर इसे स्मृति पते के रूप में गलत व्याख्या कर रहा है और इसे निकटतम कार्य के रूप में प्रदर्शित कर रहा है, लेकिन यह वास्तव में आपके दुर्घटना से संबंधित नहीं है। (+ 1778 सस्ता है: इस समारोह में 1778 बाइट्स EFLAGS अंक का मतलब है, लेकिन समारोह वास्तव में 1778 बाइट्स लंबे होने की संभावना नहीं है।)

ईएसपी ढेर सूचक है और ईबीपी है (आमतौर पर) फ्रेम सूचक (भी आधार सूचक कहा जाता है)। इन रजिस्टरों ने कॉल स्टैक पर वर्तमान फ्रेम को बाध्य किया। आपका डीबगर आमतौर पर आपको इन पॉइंटर्स के आधार पर स्टैक वैरिएबल और वर्तमान कॉल स्टैक के मान दिखा सकता है। भ्रष्टाचार के मामले में, कभी-कभी आप ईबीपी को पुनर्प्राप्त करने के लिए स्टैक का मैन्युअल रूप से निरीक्षण कर सकते हैं और कॉल स्टैक को मैन्युअल रूप से खोल सकते हैं।ध्यान दें कि फ्रेम फ्रेम पॉइंटर्स (फ्रेम पॉइंटर चूक) के बिना संकलित किया जा सकता है, अन्य उपयोगों के लिए ईबीपी को मुक्त करना; यह x86 पर आम है क्योंकि बहुत कम सामान्य प्रयोजन रजिस्ट्रार हैं।

एसएस, सीएस, डीएस, ईएस, एफएस और जीएस होल्ड सेगमेंट चयनकर्ता, segmentation को लागू करने के लिए पेजिंग से पहले बुरे पुराने दिनों में उपयोग किए जाते हैं। आज एफएस और जीएस आमतौर पर प्रक्रिया और थ्रेड स्टेट ब्लॉक के लिए ऑपरेटिंग सिस्टम द्वारा उपयोग किया जाता है; वे x86-64 में आगे बढ़ने वाले एकमात्र चयनकर्ता रजिस्ट्रार थे। चयनकर्ता पंजीयक आमतौर पर डीबगिंग के लिए सहायक नहीं होते हैं।

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