हर कोई!एलडी_PRELOADed पुस्तकालयों और बाल प्रक्रिया
छवि मैं इस तरह एक कार्यक्रम (usemalloc) है:
#include <stdio.h>
#include <stdlib.h>
#define USER_BYTES_SIZE 100
int main(void){
char* userbytes = (char*)malloc(USER_BYTES_SIZE*sizeof(char));
if(!userbytes)
return 1;
for(int i = 0; i <= USER_BYTES_SIZE; i++){ // "i <= USER_BYTES_SIZE" leads to an off-by-one memory overrun.
userbytes[i] = 0;
}
return 0;
}
जैसा कि आप देख कि, वहाँ एक बंद-एक करके बग जो एक स्मृति अतिप्रवाह हो जाती है। मैं रनटाइम पर ऐसी बग का पता लगाना चाहता हूं। एलडी_PRELOADED पुस्तकालय मेरे काम करने के लिए उचित हैं। मैंने असली malloc पर कॉल को हाइजैक करने के लिए libhijack.so नामक एक लाइब्रेरी का निर्माण किया है और इसे अपने स्वयं के कस्टम मैलोक पर कॉल के साथ प्रतिस्थापित किया है जो वास्तविक मॉलोक को कॉल करता है और वास्तविक मॉलोक द्वारा आवंटित मेमोरी स्ट्रिप्स के सिरों पर लाल जोनों को जोड़ता है। इस तरह libhijack.so के कोड:
LD_PRELOAD=./libhijack.so ./usemalloc
फिर लाल क्षेत्रों में स्मृति के लिए उपयोग कर रहे हैं अगर, मैं उन्हें पता लगाने और होगा:
void* (*real_malloc) (size_t size);
void* malloc(size_t size){
real_malloc = ((void*)(*)(size_t))dlsym(RTLD_NEXT, "malloc");
void* allocbytes = (void*)real_malloc(size + 4); //put 2 bytes at each end, call them red zones
return (allocbytes + 2);
}
मैं इस आदेश का उपयोग पुस्तकालय के साथ मुख्य कार्यक्रम चलाने उन्हें स्मृति अतिप्रवाह बग के रूप में समझाओ।
यह एलडी_PRELOAD समाधान अच्छी तरह से काम करता है जब मुख्य प्रक्रिया में मॉलोक को कॉल किया जाता है लेकिन जब फोर्कड बाल प्रक्रिया उसमें विफल होती है तो विफल हो जाती है।
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> // +
#define USER_BYTES_SIZE 100
int main(void){
pid_t child = fork();
if(child < 0)
exit(1);
if(child == 0){ //child process
char* userbytes = (char*)malloc(USER_BYTES_SIZE*sizeof(char));
if(!userbytes)
return 1;
for(int i = 0; i <= USER_BYTES_SIZE; i++){ // "i <= USER_BYTES_SIZE" leads to an off-by-one memory overrun.
userbytes[i] = 0;
}
}
else { //the current process
wait(NULL);
}
return 0;
}
अतिप्रवाह बग बच्चे प्रक्रिया में हुई LD_PRELOADed पुस्तकालय द्वारा की पहचान नहीं की जाएगी:
उदाहरण के लिए, हम "usemalloc" इस प्रकार बदल जाते हैं।
तो मेरे प्रश्न हैं: मैं एलडी_PRELOADed पुस्तकालयों का उपयोग कर बाल प्रक्रिया में ओवरफ्लो बग का पता कैसे लगा सकता हूं? क्या वह (एलडी_PRELOADed पुस्तकालयों का उपयोग कर) संभव है? यदि नहीं, तो कोई विकल्प? किसी भी सुझाव की सराहना की !!!
क्या आपने 'वालग्रींड '(और कंपाइलर्स में एएसएएन विकल्प) का उपयोग करने पर विचार किया था जो संभवतः आप जो कुछ भी चाहते हैं, वह बिना किसी' एलडी_PRELOAD' चाल के प्रदान करता है। –
वाल्ग्रिंड या पिन मेरे उपकरण के लिए बहुत भारी है। मैं सिर्फ कुछ हल्के समाधानों को हाइजैक करने के लिए LD_PRELOAD जैसे हल्के समाधान चाहता हूं। वैसे भी, टिप्पणी के लिए धन्यवाद! –
आपके पास विश्वसनीय हल्के समाधान नहीं हो सकते हैं: ऐसे बफर ओवरफ़्लो बग के लिए कोई हार्डवेयर सहायता नहीं है, और आपको कंपाइलर को पैच करने की आवश्यकता होगी। जीएससी (भविष्य 4.8) या क्लैंग (3.2) –