मैं एक निष्पादन ELF लिखने योग्य के .text खंड बनाने की जरूरत है। कार्यक्रम मैं संशोधित करने की आवश्यकता सी में लिखा है और मैं इसे संकलन कर सकते हैं। कोई विचार?मेक पाठ खंड लिखने योग्य, ELF
धन्यवाद एक बहुत।
मैं एक निष्पादन ELF लिखने योग्य के .text खंड बनाने की जरूरत है। कार्यक्रम मैं संशोधित करने की आवश्यकता सी में लिखा है और मैं इसे संकलन कर सकते हैं। कोई विचार?मेक पाठ खंड लिखने योग्य, ELF
धन्यवाद एक बहुत।
नीचे जवाब के लिए, मैं इस परीक्षण कार्यक्रम का उपयोग करने के लिए जा रहा हूँ:
#include <stdio.h>
#include <stdlib.h>
int
main (int argc, char **argv)
{
printf ("Hello world\n");
void *m = main;
*((char *) m) = 0;
exit (0);
}
संकलित साथ:
$ gcc -g -o test test.c
जैसी उम्मीद थी:
$ gdb test
...
(gdb) run
Starting program: /home/amb/so/test
Hello world
Program received signal SIGSEGV, Segmentation fault.
0x00000000004005a2 in main (argc=1, argv=0x7fffffffe628) at test.c:9
9 *((char *)m) = 0;
(gdb)
स्पष्ट मार्ग यहाँ gcc
को -Wl
ध्वज का उपयोग करने के -N
पारित करने के लिए या है (उर्फ +०१२३६६६१४५) लिंकर को, अर्थात gcc ... -Wl,--omagic ...
, हालांकि यह अन्य अवांछनीय परिणाम हो सकते हैं (उदाहरण के लिए साझा पुस्तकालयों को अक्षम करना)। आदमी पृष्ठ से:
-N
--omagic
Set the text and data sections to be readable and writable. Also, do not page-align the
data segment, and disable linking against shared libraries. If the output format
supports Unix style magic numbers, mark the output as "OMAGIC". Note: Although a
writable text section is allowed for PE-COFF targets, it does not conform to the format
specification published by Microsoft.
की है कि एक जाना देता हूँ:
$ gcc --static -g -Wl,--omagic -o test test.c
$ ./test
Hello world
$
कि ठीक काम करता है, लेकिन आप गतिशील पुस्तकालय समर्थन खो दिया है।
गतिशील पुस्तकालय समर्थन रखने के लिए, और एक लिखने योग्य पाठ खंड बना रहे, आप का उपयोग करने के लिए सक्षम होना चाहिए:
objcopy --writable-text ...
आदमी पृष्ठ से:
--writable-text
Mark the output text as writable. This option isn't meaningful for all object file
formats.
यह काम करना चाहिए, लेकिन नहीं करता है 'टी, objdump
सत्यापित करेगा। तो यहां एक समाधान है जो --writable-text
से थोड़ा आगे हो जाता है, जैसा कि ओपी ने टिप्पणियों में कहा है, यह टिन^वमानपेज पर जो कुछ भी कहता है, वह ऐसा नहीं करता है।
चलो देखते हैं कैसे वर्गों चिह्नित कर रहे हैं:
$ gcc -g -o test test.
$ objdump -h test | fgrep -A1 .text
12 .text 00000192 0000000000400490 0000000000400490 00000490 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
आइए अब कि READONLY
ध्वज से छुटकारा पाने:
$ objcopy --set-section-flags .text=contents,alloc,load,code test test1
$ objdump -h test1 | fgrep -A1 .text
12 .text 00000192 0000000000400490 0000000000400490 00000490 2**4
CONTENTS, ALLOC, LOAD, CODE
और अब READONLY
चला गया है, के रूप में अनुरोध किया।
लेकिन:
$ gdb test1
...
(gdb) run
Starting program: /home/amb/so/test1
Hello world
Program received signal SIGSEGV, Segmentation fault.
0x00000000004005a2 in main (argc=1, argv=0x7fffffffe628) at test.c:9
9 *((char *)m) = 0;
(gdb)
मुझे लगता है यहां मुद्दा यह है कि अन्य की तुलना में कुछ और ELF अनुभाग का नाम केवल पढ़ने के लिए जब वास्तव में भरी हुई अनुभाग बना रही है है। शायद यही कारण है कि लोग आपको mprotect
का उपयोग करने का सुझाव दे रहे हैं। खेद है कि अधिक मदद नहीं हुई है।
पहले आपके उत्तर के लिए धन्यवाद। लेकिन objcopy काम नहीं करता है और विकल्प-XN मेरे जीसीसी द्वारा मान्यता प्राप्त नहीं है .. – Cronovirus
@ क्रोनोवायरस - अच्छी तरह से, भरोसेमंद विधि (लिंक समय पर उपलब्ध नहीं है) 'mprotect' के साथ अपनी स्मृति सुरक्षा को बदलना होगा। यदि आप स्रोत को नहीं बदल सकते हैं, तो शायद इसे प्राप्त करने के लिए 'LD_PRELOAD' का उपयोग करें। – abligh
धन्यवाद, मुझे mprotect पता है, लेकिन मैं पहले एक स्थिर समाधान की तलाश में था .. – Cronovirus
पर्याप्त स्पष्ट नहीं है। .text usuaally कोड है। यह आपके सॉफ्टवेयर/फर्मवेयर कहां रखा गया है? – LPs
शायद यह एक डुप्लिकेट है, लेकिन दूसरे प्रश्न में उन्होंने ऐसे समाधान साझा किए जो काम नहीं करते हैं। – Cronovirus
हां मुझे रन टाइम पर कोड संशोधित करने की आवश्यकता है, इसलिए टेक्स्ट सेगमेंट को लिखने योग्य होना चाहिए .. – Cronovirus