2010-03-03 6 views
6

जब मैंने विकल्प -फस्टैक-चेक और -फस्टैक-रक्षक जोड़ा तो मेरा प्रोग्राम क्रैश हो गया। __stack_chk_fail को पीछे के निशान में बुलाया जाता है।जीसीसी विकल्प -फस्टैक-चेक वास्तव में कैसे काम करता है?

तो मुझे कैसे पता चलेगा कि समस्या कहां है? वास्तव में क्या जांचता है? जीसीसी के बारे में जानकारी जवाब खोजने के लिए बहुत बड़ी लगती है।

उत्तर

5

विधानसभा कार्यक्रम की जाँच के बाद। मुझे लगता है कि -फस्टैक-चेक, स्टैक पॉइंटर के ऑफसेट पर कोड लिखने 0 जोड़ देगा, ताकि यह जांचने के लिए कि प्रोग्राम उल्लंघन उल्लंघन पर जाता है, तो प्रोग्राम क्रैश हो जाता है। उदा। mov $ 0x0, -0x928 (% esp)

+0

क्या आप कुछ कोड उदाहरण और आउटपुट के साथ विस्तार कर सकते हैं? –

+0

इसमें आपकी त्रुटि से कोई लेना देना नहीं है। नीचे मेरा जवाब देखें – rurban

2

"` -fstack-रक्षक 'इस तरह के ढेर स्मैश हमलों के रूप में, बफर अतिप्रवाह के लिए जाँच की चपेट में वस्तुओं के साथ कार्यों के लिए एक गार्ड चर जोड़कर। यह किया जाता है अतिरिक्त कोड का उत्सर्जन करता है। यह काम करता है कि कॉल alloca भी शामिल है, और 8 बाइट से बड़ी बफ़र्स के साथ काम करता है। जब एक समारोह में प्रवेश किया जाता है और फिर जाँच की जब समारोह बाहर निकलता है। एक गार्ड की जांच विफल रहता है, एक त्रुटि संदेश मुद्रित और कार्यक्रम बाहर निकलता है "

GCC Options That Control Optimization है गार्ड प्रारंभ कर रहे हैं

GCC extension for protecting applications from stack-smashing attacks

Smashing The Stack For Fun And Profit

मैं उम्मीद है कि यह कुछ सुराग दे देंगे ..

+0

यह एक बहुत बड़ी मदद है, धन्यवाद। – stcatz

+4

कृपया ध्यान दें कि '-फस्टैक-रक्षक' और '-फस्टैक-चेक' अलग-अलग विकल्प हैं। (साथी googlers के लिए) – Offirmo

1

-fstack-check: दो सुविधा मैक्रो STACK_CHECK_BUILTIN और STACK_CHECK_STATIC_BUILTIN डिफ़ॉल्ट 0 पर छोड़ दिया जाता है, यह सिर्फ एक शून्य बाइट सम्मिलित करता है हर 4KB (पेज) जब ढेर बढ़ता है। डिफ़ॉल्ट रूप से केवल एक, लेकिन जब स्टैक एक से अधिक पृष्ठों को विकसित कर सकता है, जो सबसे खतरनाक मामला है, हर 4 केबी। लिनक्स> 2.6 में केवल स्टैक और ढेर के बीच केवल एक छोटा सा पृष्ठ अंतर है, जो 2005 से ज्ञात स्टैक-गैप हमलों का कारण बन सकता है। असेंबली के लिए What exception is raised in C by GCC -fstack-check option देखें। यह 3.6 से कम से कम 2.95.3 के बाद जीसीसी में सक्षम है।

__stack_chk_fail डाला गया -fstack-protector कोड जो डाला गया स्टैक कैनरी मान सत्यापित करता है जिसे एक साधारण स्टैक ओवरफ़्लो द्वारा ओवरराइट किया जा सकता है, उदा। रिकर्सन द्वारा।