2012-05-23 24 views
14

मैंने सी में एक एप्लीकेशन लिखा है, और मैं समझने की कोशिश कर रहा हूं कि संकलन करते समय -फनो-स्टैक-रक्षक कमांड का उद्देश्य क्या है। मेरे विशिष्ट अनुप्रयोग के लिए, यदि मैं इस आदेश का उपयोग करता हूं या बफर ओवरफ़्लो के विरुद्ध सुरक्षा के संदर्भ में नहीं, तो इससे कोई फर्क नहीं पड़ता है।-फनो-स्टैक-रक्षक का उपयोग क्या है?

मैंने ऑनलाइन पढ़ा है कि -फस्टैक-रक्षक और -फनो-स्टैक-रक्षक कमांड क्रमशः स्टैक-स्मैशिंग रक्षक को सक्षम और अक्षम करते हैं, लेकिन यदि मैं स्वयं एप्लिकेशन को संकलित कर रहा हूं, तो संरक्षक को पहले से कैसे सक्षम किया जा सकता है ? क्या कमांड का उपयोग शायद इस बात पर निर्भर करता है कि एप्लिकेशन किस सिस्टम पर चल रहा है?

धन्यवाद

उत्तर

8

मानक/शेयर जीसीसी में, ढेर रक्षक डिफ़ॉल्ट रूप से बंद है। हालांकि, कुछ लिनक्स वितरण ने इसे डिफ़ॉल्ट रूप से चालू करने के लिए जीसीसी को पैच किया है। मेरी राय में, यह बल्कि हानिकारक है, क्योंकि यह मानक उपयोगकर्ता स्पेस पुस्तकालयों के साथ जुड़ा हुआ कुछ भी संकलित करने की क्षमता को तोड़ देता है जब तक कि मेकफ़ाइल विशेष रूप से स्टैक रक्षक को अक्षम न करे। यह लिनक्स कर्नेल बिल्ड को भी तोड़ देगा, सिवाय इसके कि इस हैक के वितरण ने जीसीसी को अतिरिक्त हैक जोड़ा है यह पता लगाने के लिए कि कर्नेल बनाया जा रहा है और इसे अक्षम कर रहा है।

+2

, परिभाषा के द्वारा, कुछ भी ढेर संरक्षण के साथ एक सिस्टम पर पर डिफ़ॉल्ट रूप से संकलित नहीं चाहेंगे ढेर संरक्षण के साथ बनाया गया पुस्तकालयों के खिलाफ जुड़ा हुआ मिलता है क्योंकि वे स्टैक संरक्षण के साथ एक प्रणाली पर संकलित किया गया होगा? – tbert

+1

मुझे लगता है कि आप मेरे उत्तर के दूसरे भाग (इस बारे में टिप्पणियां क्यों समस्याग्रस्त हैं) से निपट रहे हैं और यदि ऐसा है, तो उस मामले में उत्तर नहीं है। किसी भी कोड को मेजबान के उपयोगकर्ता स्पेस पारिस्थितिक तंत्र के हिस्से के रूप में चलाने का इरादा नहीं है, किसी भी मेजबान पुस्तकालयों के खिलाफ जुड़ा नहीं जा रहा है। (उदाहरण के लिए, किसी कर्नेल को किसी भी उपयोगकर्ता स्पेस लाइब्रेरीज़ के खिलाफ लिंक नहीं किया जाता है। अन्य उदाहरण बूटलोडर कोड होंगे, मॉड्यूल को पढ़ने के लिए और एक dynrec/JIT एमुलेटर आदि द्वारा टेम्पलेट्स के रूप में उपयोग किया जाना चाहिए) –

+0

कर्नेल स्पेस के बारे में बात नहीं कर रहा था, लेकिन उपयोगकर्ता स्थान; सी संकलक के साथ जेआईटी संकलन नहीं किया जा रहा है; इसलिए, मुझे पूछना है, लिनक्स कर्नेल के लिए संकलन तर्क में "-फनो-स्टैक-रक्षक" सेट करने के बाद, उपयोगकर्तालैंड में स्टैक सुरक्षा को चालू करने में क्या समस्या है? – tbert

10

यदि आप -fstack-protector के साथ संकलित करते हैं, तो स्टैक पर आवंटित थोड़ी अधिक जगह होगी और एक फ़ंक्शन से वापस लौटने के लिए थोड़ा अधिक ओवरहेड होगा, जबकि कोड चेक सेट करता है और फिर वास्तव में जांचता है कि आपके पास है या नहीं समारोह में रहते हुए ढेर को अधिलेखित किया।

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

सुरक्षा प्रति सिस्टम पर निर्भर नहीं है; यह आपके द्वारा उपयोग किए जा रहे कंपाइलर के संस्करण पर निर्भर करता है, लेकिन यह सब कुछ है।

+0

'-फस्टैक-रक्षक' भी एक स्मैश का पता लगाने में आसान बनाने के लिए स्टैक लेआउट को फिर से व्यवस्थित करता है। – jww

0

स्टैक रक्षक कोड है जो संकलक द्वारा उत्पन्न होता है और आपके प्रोग्राम को में रखा गया है। यह एक बाहरी प्रोग्राम या सिस्टम कॉल नहीं है जिसे आपके प्रोग्राम द्वारा बुलाया जाता है।

1

टाइम्स कि एक डिफ़ॉल्ट संकलक सेटिंग से मेल खाता है उपयोगी हो सकता है विकल्प शामिल होता है:

  • जब आप एक निर्माण प्रणाली एक जटिल विन्यास है कि आप परिवर्तित करना चाहते हो सकता है का उपयोग कर रहे हैं। मेकफ़ाइल के भूलभुलैया में यह पता लगाने के बजाय कि यह fstack-protector (उदाहरण के लिए) का उपयोग करना चुन सकता है, यह आपको आसानी से विकल्पों की सूची के अंत तक पहुंचने वाले अतिरिक्त विकल्पों में आसानी से गुजरने दे सकता है। यदि जीसीसी विकल्पों के सेट में fstack-protector और fno-stack-protector दोनों को देखता है, तो कमांड लाइन पर अंतिम एक प्रभावशाली होता है।

  • दूसरी बार इस तरह की चीज आसान हो सकती है (जो -fstack-protector पर लागू नहीं होती है), तब आपके पास एक विकल्प है जो 'उप-विकल्प' का समूह बन जाता है। उदाहरण के लिए, सेटिंग -O2 -fxxx ऑप्टिमाइज़ेशन विकल्पों में से एक को चालू करता है, और आप अधिकांश भाग के लिए -O2 का उपयोग करना चाहेंगे लेकिन जीसीसी के सख्त एलियासिंग अनुकूलन नहीं चाहते हैं। तो आप उस विशेष विकल्प को अपनी डिफ़ॉल्ट सेटिंग में वापस सेट करने के लिए -fno-strict-aliasing निर्दिष्ट कर सकते हैं।(नोट: इस मामले वास्तव में उपरोक्त मामले के बराबर है) बारी में,