आपके द्वारा पोस्ट किया गया पुराना लिनक्स एक बहुत नाजुक हैक करने की कोशिश कर रहा था। समारोह इस तरह परिभाषित किया गया था:
int do_signal(long signr,long eax,long ebx, long ecx, long edx, long orig_eax,
long fs, long es, long ds,
long eip, long cs, long eflags,
unsigned long * esp, long ss)
समारोह तर्क वास्तव में समारोह (signr
को छोड़कर) के लिए तर्क का प्रतिनिधित्व नहीं करते, लेकिन मानों फ़ंक्शन कॉल (एक कर्नेल व्यवधान/अपवाद संचालक विधानसभा में लिखित) पर संरक्षित do_signal
पर कॉल करने से पहले ढेर। *(&eax) = -EINTR
कथन स्टैक पर ईएक्स के संरक्षित मूल्य को संशोधित करने के लिए है। इसी प्रकार कथन *(&eip) = old_eip -= 2
कॉलिंग हैंडलर के रिटर्न पते को संशोधित करने के लिए है। do_signal
के बाद हैंडलर नामित रजिस्टरों को बहाल करने वाले स्टैक से पहले 9 "तर्क" पॉप करता है। इसके बाद यह IRETD
निर्देश निष्पादित करता है जो स्टैक से शेष तर्कों को पॉप करता है और उपयोगकर्ता मोड पर वापस आ जाता है।
यह हैक कहने की जरूरत नहीं है कि यह हैक अविश्वसनीय रूप से अविश्वसनीय है। यह कंपाइलर जेनरेटिंग कोड पर निर्भर करता है जिस तरह से उन्होंने उम्मीद की थी। मुझे आश्चर्य है कि इसने युग के जीसीसी कंपाइलर को भी काम किया है, मुझे संदेह है कि जीसीसी ने इसे ऑप्टिमाइज़ेशन शुरू करने से बहुत पहले ही इसे तोड़ दिया था।
स्रोत
2014-08-27 15:14:14
क्या आप हमें उस कर्नेल स्रोत का लिंक प्रदान कर सकते हैं ?? या फ़ंक्शन की पूर्ण परिभाषा जोड़ें (यदि यह बहुत लंबा नहीं है)। –
यह कंपाइलर को ईएक्स के लिए रजिस्टर का उपयोग करने से रोक सकता है और इसे स्टैक पर मेमोरी का उपयोग करने के लिए मजबूर कर सकता है। –
@ KlasLindbäck: अच्छा !!! आपको इसे लिखना चाहिए क्योंकि यह संभवतः सही उत्तर है (नाम 'eax' वास्तव में insinuates कि यह कारण है)। –