2016-03-16 8 views
6

पर लोड नहीं होता है, मैं एक प्रक्रिया में एसओ इंजेक्ट करने की कोशिश कर रहा हूं जो systemd init system (LD_PRELOAD का उपयोग करके) का उपयोग शुरू करता है, लेकिन यह नई प्रक्रिया में लोड नहीं होता है।LD_PRELOAD systemd

int rand(){ 
    return 42; //the most random number in the universe 
} 
कमांड लाइन के साथ

:

gcc -shared -fPIC unrandom.c -o unrandom.so 

मैं .service फ़ाइल बदल शामिल करने के लिए:

Environment="LD_PRELOAD=/tmp/unrandom.so" 

मैं एक बुनियादी अतः (unrandom.c) का अनुपालन सेवा शुरू करने के बाद प्रक्रिया में एलडी_PRELOAD पर्यावरण चर मौजूद है, लेकिन एसओ इंजेक्शन नहीं

cat /proc/<PID>/maps 

क्या मुझे कुछ याद आ रही है?

मेरे मशीन RHEL7

+0

यदि आप शैल से भागते हैं तो यह काम करता है? – hek2mgl

+0

हाँ, अगर मैं सीधे खोल से कमांड चला रहा हूं तो यह काम कर रहा है ... –

+0

मुझे इसका परीक्षण करने की आवश्यकता होगी। मैं आपको शाम को एक प्रतिक्रिया दे सकता हूं। बीटीडब्ल्यू, अजीब विचार! :) क्या मैं पूछ सकता हूं कि तुम ऐसा क्यों कर रहे हो? – hek2mgl

उत्तर

2

setuid प्रक्रियाओं LD_PRELOAD का उपयोग प्रतिबंधित है (और कुछ अन्य env। चर) सुरक्षा कारणों से।

लोड की गई लाइब्रेरी केवल नाम के माध्यम से निर्दिष्ट की जानी चाहिए और /etc/ld.so.conf में सूचीबद्ध निर्देशिकाओं में से एक में स्थित होना चाहिए (उदा। this link देखें)। जो प्रबल संभावना है

sudo echo path/to/library.so >> /etc/ld.so.preload 

लेकिन तब यह सब नई प्रक्रियाओं के लिए पहले से लोड हो जाएगा (: डेबियन-आधारित सिस्टम पर उदाहरण के लिए

sudo cp library.so /usr/lib/x86_64-linux-gnu 
LD_PRELOAD=library.so daemon 

एक और दृष्टिकोण /etc/ld.so.preload के पुस्तकालय के लिए पूर्ण पथ डाल करने के लिए है यदि आप बेहद सावधान नहीं हैं तो अपने सिस्टम को तोड़ने के लिए)।

+0

तो प्रीलोड करने के लिए सटीक कदम क्या हैं? – Velkan

+0

@ वेल्कन: अद्यतन उत्तर। – yugr

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