क्या जीडीबी डीबग रूट प्रोग्राम पर डिबग कर सकता है?


16

मैंने एक प्रोग्राम लिखा जो कॉल करता है setuid(0)और execve("/bin/bash",NULL,NULL)

फिर मैंने किया chown root:root a.out && chmod +s a.out

जब मैं निष्पादित करता ./a.outहूं तो मुझे एक रूट शेल मिलता है। हालाँकि जब मैं gdb a.outइसे सामान्य उपयोगकर्ता के रूप में शुरू करता हूँ, और एक उपयोगकर्ता शेल लॉन्च करता हूँ।

तो ... क्या मैं एक रूट रूट प्रोग्राम डिबग कर सकता हूं?

जवाबों:


22

यदि कोई डिबगर रूट के रूप में चल रहा हो, तो आप केवल एक सेटिड या सेटगिड प्रोग्राम को डीबग कर सकते हैं। कर्नेल आपको ptraceअतिरिक्त विशेषाधिकार के साथ चलने वाले प्रोग्राम पर कॉल नहीं करने देगा । यदि ऐसा होता है, तो आप प्रोग्राम को कुछ भी निष्पादित करने में सक्षम होंगे, जिसका प्रभावी रूप से मतलब होगा कि आप उदाहरण के लिए डिबगर को कॉल करके एक रूट शेल चला सकते हैं /bin/su

यदि आप Gdb को रूट के रूप में चलाते हैं, तो आप अपना प्रोग्राम चला सकेंगे, लेकिन रूट द्वारा चलाने पर आप केवल इसका व्यवहार देख पाएंगे।

यदि आपको प्रोग्राम को डिबग करने की आवश्यकता है जब वह रूट से शुरू नहीं होता है, तो प्रोग्राम को Gdb के बाहर शुरू करें, इसे परेशानी वाले हिस्से में पहुंचने से पहले कुछ फैशन में ठहराव दें, और attachGdb के अंदर की प्रक्रिया ( at 1234जहां 1234 प्रक्रिया आईडी है)।


हां मैंने कोशिश की थी, लेकिन प्रक्रिया को रूट के रूप में शुरू किया गया है, और जीडीबी को रूट के रूप में शुरू किया जाना चाहिए ताकि रूट की प्रक्रिया को संलग्न करने में सक्षम हो।
जेज

@ जेजुज हां, जैसा कि मैं लिखता हूं कि आपको जीडीबी को रूट के रूप में शुरू करना होगा। या यदि आप चाहें तो आप दूरस्थ डिबगिंग का उपयोग कर सकते हैं और gdbserverरूट के रूप में चला सकते हैं और इसे सामान्य उपयोगकर्ता के रूप में कनेक्ट कर सकते हैं। आपकी टिप्पणी से ऐसा लगता है कि आपने इसे सरल तरीके से करने का प्रबंधन नहीं किया था (रूट के रूप में जीडीबी को चलाना) लेकिन मुझे समझ नहीं आता कि क्या गलत हुआ, इसलिए मैं मदद नहीं कर सकता।
गिलेस एसओ- बुराई को रोकना '

7

यदि आप चाहें तो किसी प्रक्रिया को एक रोकी हुई अवस्था में शुरू करने का एक तरीका है। एक बैश स्क्रिप्ट का उपयोग करें:

echo $BASHPID; kill -STOP $BASHPID; exec sudo -u unpriviledged_user -g the_group_if_not_primary command

उस रन को पृष्ठभूमि में बनाएं।

फिर शुरू करें gdb, और उस पीआईडी ​​के साथ संलग्न करें जो मुद्रित किया गया था।

आपको execकमांड के साथ कदम रखना होगा gdb, लेकिन आप शुरुआत से ही डिबग कर पाएंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.