2015-02-17 8 views
6

मैं लिनक्स पर सी में लिखे कार्यक्रमों पर नियंत्रण प्रवाह अपहरण हमलों प्रयोग कर रहा हूँ। मैं नो-एक्सएक्सटेबल-स्टैक काउंटरमेज़र सक्षम प्रोग्राम के साथ एक प्रोग्राम पर एक साधारण रेट-2-libc हमला करने की कोशिश कर रहा हूं। इस प्रयोजन के लिए मैं system() समारोह की ओर लौटने रहा हूँ तर्क /bin/sh साथ।सिस्टम() का उपयोग कर रिटर्न-टू-लिबैक खोल क्यों तुरंत निकलता है?

लेकिन मैं एक समस्या है: हालांकि मेरी हमले काम करता है और एक खोल सफलतापूर्वक पैदा की है, खोल पहला वर्ण दर्ज करने के बाद तुरंत बाहर निकल जाता है! यही है, मैं किसी भी कुंजी दबाए जाने के बाद खोल बंद हो जाता है!

यह व्यवहार इस सरल सी कोड में भी मानने योग्य है:

int main() { system("/bin/sh"); return 0; } 

मैं इसे का उपयोग कर संकलन: gcc code.c -o system

ऐसा क्यों है? और मैं इसे कैसे ठीक कर सकता हूं?

मैं साथ kernel 2.6.28 और glibc-2.9-1


अद्यतन Ubuntu-9.04 पर प्रयोग कर रहा हूँ: खोल इंटरैक्टिव हो जाता है यदि और केवल यदि पहले महत्वपूर्ण यह है कि मैं प्रेस है दर्ज करें। यही कारण है, अगर पहले चरित्र है कि मैं में प्रवेश एक new-line (\n) है तो खोल खुला रहता है और इंटरैक्टिव बन रहा है।

तो किसी को समझा सकते हैं क्या यहाँ हो रहा है?

+1

यह देखते हुए कि आप मानक और वैध सी कोड के साथ समस्या को पुन: कर सकते हैं पता चलता यह आपका फायदा उठाने का प्रयास से संबंधित नहीं है, इस प्रकार इस सवाल का बेहतर स्टैक ओवरफ़्लो के लिए अनुकूल है। –

+0

@ AndréDaniel True; फिर भी यह एक सामान्य प्रोग्रामिंग मुद्दे की तरह नहीं है और शेलकोड विकास के क्षेत्र में विशेषज्ञ बेहतर मदद कर सकते हैं। इस प्रकार मैंने इसे यहां पूछा। –

+2

मैं इसे अपने कोड से पुन: उत्पन्न नहीं कर सकता। यह वास्तव में एकमात्र चीज है जो आप वहां करते हैं? आप इसे कैसे निष्पादित करते हैं? – StenSoft

उत्तर

0

ठीक है मेरा मानना ​​है कि सिस्टम सफलतापूर्वक /bin/sh पर कॉल कर रहा है लेकिन यह इसे -सी ध्वज के साथ बुला रहा है।

प्रयास करें:

/bin/bash -c junk 

है कि आप क्या देख रहे हैं की तरह ही व्यवहार करना चाहिए। सिस्टम कॉल को सेट करने के लिए आपको रजिस्टरों के साथ खेलना होगा ताकि/bin/sh को ध्वज के बिना बुलाया जा सके।

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