Rendre le segment de texte accessible en écriture, ELF

J’ai besoin de rendre le segment .text d’un ELF exécutable en écriture. Le programme que je dois modifier est écrit en C et je peux le comstackr. Des idées?

Merci beaucoup.

Pour la réponse ci-dessous, je vais utiliser ce programme de test:

#include  #include  int main (int argc, char **argv) { printf ("Hello world\n"); void *m = main; *((char *) m) = 0; exit (0); } 

Comstackr avec:

 $ gcc -g -o test test.c 

Comme prévu:

 $ 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) 

La -Wl évidente consiste ici à utiliser le drapeau -Wl à gcc pour passer -N ou (alias --omagic ) au lieur, c’est-à-dire gcc ... -Wl,--omagic ... , bien que cela puisse avoir d’autres résultats indésirables. (par exemple, désactivation des bibliothèques partagées). De la page de manuel:

  -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. 

Essayons cela:

 $ gcc --static -g -Wl,--omagic -o test test.c $ ./test Hello world $ 

Cela fonctionne bien, mais vous avez perdu le support de la bibliothèque dynamic.

Pour conserver le support dynamic des bibliothèques et conserver un segment de texte accessible en écriture, vous devriez pouvoir utiliser:

 objcopy --writable-text ... 

De la page de manuel:

  --writable-text Mark the output text as writable. This option isn't meaningful for all object file formats. 

Cela devrait fonctionner, mais ne fonctionne pas, comme l’ objdump le vérifiera. Voici donc une solution qui va un peu plus loin que --writable-text qui, comme le dit OP, dans les commentaires, ne semble pas faire ce qu’elle dit sur la page Web.

Voyons comment les sections sont marquées:

 $ gcc -g -o test test. $ objdump -h test | fgrep -A1 .text 12 .text 00000192 0000000000400490 0000000000400490 00000490 2**4 CONTENTS, ALLOC, LOAD, READONLY, CODE 

Maintenant, READONLY drapeau 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 

et maintenant READONLY est parti, comme demandé.

Mais:

  $ 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) 

J’imagine que le problème ici est que quelque chose d’autre que le nom de la section ELF rend la section en lecture seule lorsqu’elle est chargée. C’est probablement pourquoi les gens suggèrent d’utiliser mprotect . Désolé de ne pas avoir été plus d’aide.