Selon Ce fil , mémoire allouée par malloc < / code> au moins avoir
prot_read | Prot_exec code>, sinon la fonction contanée ne peut pas être exécutée. P>
homme malloc code> ne mentionne rien de la protection ainsi la question. p>
4 Réponses :
Vous devrez peut-être appeler mprotect code> pour définir le drapeau
prot_exec code> vous-même, une fois que la mémoire a été allouée. P>
Semble pas, voir le paragraphe lié, il n'implique pas mProtect code> qui indique la mémoire renvoyée par
malloc code> a déjà
prot_exec code> activé.
@Je rog: ok - je suis surpris que Linux se distingue prot_exec code> par défaut pour la mémoire Malloc'd - il se peut que d'autres systèmes d'exploitation prennent une approche plus défensive - si votre question est spécifique à Linux, alors Vous devriez probablement étiqueter
linux code>.
Oui, c'est le cas, je veux savoir quels autres drapeaux sont définis mais Man Malloc Code> ne donne aucun indice. De plus, je ne sais pas si c'est spécifique Linux, alors je ne pense pas qu'il soit approprié d'ajouter cette balise.
@JE ROG: Il est probablement préférable de ne pas faire d'hypothèses, en particulier si vous vous souciez de la portabilité et d'être une preuve future.
Les anciens processeurs X86 n'ont pas d'exécution de bits d'autorisation pour les pages, de sorte que la permission est généralement une autorisation implicite de l'exécution. Les CPU plus récents ont un bit NX (non exécuté).
Si vous souhaitez exécuter du code à partir de la mémoire que vous avez alloué, vous devrez donner des autorisations d'exécution explicitement, et éventuellement vous devrez supprimer les autorisations d'écriture, car il est à la fois d'écrire et d'exécuter des autorisations sur la même mémoire est considérée comme potentiellement dangereuse. sur certains systèmes (communément appelé w ^ x). p>
Il y a eu plusieurs autres threads sur l'exécution du code de la mémoire allouée par le programmeur: p>
allouer de la RAM exécutable en C sur Linux malloc () code> retournera normalement la mémoire avec des autorisations de lecture et d'écriture. Certaines architectures (E.G: plus âgée x86) peuvent ne pas permettre la désactivation de l'exécution de l'autorisation de manière simple, mais c'est juste une dégénéfice de la plate-forme. P>
est-il possible d'exécuter du code de la pile en standard c? p>
Avez-vous une machine qui a le bit NX pour le tester?
Parmi les raisons MALLOC code> n'est pas le bon outil d'attribution de mémoire pour le code. Vous devez utiliser
MMAP code> et, en fonction des stratégies de sécurité paranoïaque de votre système, vous devrez peut-être utiliser
MProtect code> pour changer les autorisations. P>
MALLOC CODE> n'est pas le bon outil: p>
MALLOC code> est peu susceptible d'être alignée à la page, et vous finirez ainsi de définir des autorisations sur la mémoire adjacente aussi, éventuellement casser des choses. < / li>
GRATUIT code>, vous risquez de casser
MALLOC code> S internals. LI>
ul>
En ce qui concerne Les autorisations sont définies uniquement avec la granularité de page i>, avez-vous la mémoire renvoyée par VOID * MMAP (VOID * Démarrer, Taille_T Longueur, int Prot, Int Drapeaux, int FD, Off_T Offset); < / code> est toujours dans l'unité de page? Ne semble pas être garnuant par
paramètre code>.
@JE ROG: Oui, MMAP () crée des mappages de mémoire, qui ont une granularité de page (sauf sur! MMU Systems)
Et "! MMU" ne peut pas être conforme à POSIX (qui nécessite une protection de la mémoire).
@ninjalj, la longueur code> n'a pas besoin d'être un multiple de page, comment venir? Cela signifie-t-il si nous MMAP
4000 code> octets, puis
96 code> octets seront gaspillés?
@Je ROG: Ils seront mappés, voir / proc /
La longueur sera arrondie jusqu'à la taille de la page multiple.
Un fichier est mappé en multiples de la taille de la page. Pour un fichier qui n'est pas un multiple de la taille de la page, la mémoire restante est mise à zéro lorsque mappée et écrit à cette région n'est pas écrite dans le fichier. L'effet de la modification de la taille du fichier sous-jacent d'un mappage sur les pages correspondant à des régions ajoutées ou supprimées du fichier est indéterminée. Code>
@R .., non arrondi, je pense que gaspillé b> est plus précis puisque l'effet de l'écriture sur les 96 octets supplémentaires n'est pas spécifié.
La fonction de bibliothèque MALLOC () est spécifiée par la norme de langage C. Il est donc identique sur tous les systèmes d'exploitation. La protection de la mémoire est fonction du processeur et du système d'exploitation. Elle est donc faite différemment sur Windows, Linux, etc. P>
La manière dont ces travaux ont changé au fil des ans depuis que Malloc () a été défini. Je me souviens que la plupart des transformateurs n'avaient pas pris en charge une autorisation "exécutable" distincte pour la mémoire - si elle était lisible, elle était exécutable. De nombreux systèmes intégrés n'ont aucune protection de la mémoire, toutes les mémoires peuvent être lues, écrites et exécutées. La fonction MALLOC () fonctionne de la même manière dans tous ces cas. P>
Êtes-vous sûr que c'est le bon fil? Je ne vois rien sur prot_read ou Prot_exec là-bas. Je pensais que ces deux étaient liés au MMAP. (Voir pubs.opengroup.org/onlinepubs/007908799/xsh/mmap.html < / a>)
@Catcall, c'est pourquoi je dis
malloc code> de mémoire renvoyée implicitement a
prot_read code> ou
prot_exec code> sur, car il n'a pas à
MProtect ( P, 1024, Prot_Read | prot_exec) code> pendant que la mémoire renvoyée par
mmap code> doit.