Acces à l'execution des données sous linux

Fermé
nicolas - 25 sept. 2005 à 00:19
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 5 février 2025 - 25 sept. 2005 à 23:45
bonjour
voila c un peu compliqué ce que je fais je sais pas si quelqu'un pourra y répondre:
je suis en train de programmer sous linux sur i386 un programme un peu particulier qui demande d'éxecuter du language machine dans des données, en fait dans un tableau de char, mais cela pose problème:
au moment ou le programme saute dans le tableau il y'a une segment faut, est ce que cela est normal ou le problème vient de moi,y'a t'il un moyen de remédier à cela?
merci bcp si vous pouvez m'aider

au pire je programmerai mon bout de language machine dans une fonction classique si j'y arrive
A voir également:

8 réponses

kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 5 février 2025 1 526
25 sept. 2005 à 05:20
Salut,

Pourquoi as tu besoin d'executer du langage machine de cette manière?
0
crabs Messages postés 908 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 3 août 2008 507
25 sept. 2005 à 10:14
Salut,
Lors de mes vieux cours système UNIX, il me semble que le système se protège
contre le passage d'un espace DATA en espace EXECUTABLE. Ceci peut se faire
grace à la gestion de mémoire virtuelle.
Donc si ta page mémoire est marquée non-exécutable (DATA) et si un processus
essaie d'exécuter du code contenu dans une telle page : core.
Seul le noyau peut changer cette protection (sinon impossible de lancer un
programme).
La bibliothèque dynamique pourrait te permettre de contourner ton problème.
A+, crabs
0
en fait si je veux exécuter du language machine comme ceci c'est parceque je veux changer de segment en utilisant la LDT des 386(c'est pour faire une espèce d'émulateur enfin c un peu compliqué ),effectivement je pense que, à l'aide de la mémoire virtuelle linux protège les données de l'exécution je me demande si il n'y a pas un appelle système pour éviter ce problème car les programmeurs de wine doivent être confronter au même problème!
en tout cas merci pour vos réponses
0
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 5 février 2025 1 526
25 sept. 2005 à 16:03
Pourtant il y a peu de temps j'ai pu exécuter du code assembleur de cette manière: déclarer un tableau char avec des données hexadécimale (du langage machine). Puis un pointeur vers une fonction void. Ensuite j'ai fait pointer ce pointeur vers le tableau char, j'ai eu aucun soucis, ça a bien marché.

Donc à mon avis, il n'y a pas de protection à ce niveau, en tout cas pas chez moi, (je suis sous debian etch).

Je m'y connais pas trop en assembleur, mais je pense qu'une fonction comme __asm__() rendrait le code plus lisible, plus facile à débugguer.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
oui en fait ça doit venir soit du fait que ton tableau est déclaré dans en "dynamique" c'est à dire avec malloc soit de ton processeur quel processeur a tu? moi g un AMD;car moi d'abord j'ai déclaré un tableau en static et ça ne marchais pas puis g déclaré un tableau en dynamique mais en plus en utilisant la fonction mprotect pour retirer la protection en execution du bout de données et la ça marchais,sinon il se peut que ton processeur ne gère pas la protection en execution car si je ne me trompe pas les 386 à la base ne le gérais pas.
voila
Sinon g une autre question si quelqu'un arrive à y répondre car c'est assez compliqué encore une fois:
dans mon bout de code g écri:
mov 0x0c,%ax (avec la syntaxe at&t c'est à dire source,detination)(0x0c = 00001 1 00 ce qui signifie que c un selector l'entrée d'index 1 de la ldt avec un request privilege level de 0 (g précédement déclaré le descripteur correspondant))
mov %ax,%cs (code segment)

et à cet endroit la il y'a une segment fault

tandis que si je fais la même chose dans une fonction en assembler je n'ai pas ce problème:je ne comprend pas!
par contre j'ai une segment fault quand j'éssaye de faire la même chose avec %ss
au fait pourquoi as tu fait ton bout de code en language machine?
0
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 5 février 2025 1 526
25 sept. 2005 à 20:36
J'ai un amd athlon xp (i686).
Je ne sais pas si c'est mon processeur ou si c'est l'os (voire gcc), aucune idée. Et mon tableau était bien déclaré en statique.
Je pourrais pas t'aider pour l'asm.

au fait pourquoi as tu fait ton bout de code en language machine?

En fait je m'étais vaguement mis à l'asm, et j'ai découvert les appels systèmes sous Linux, donc je m'amusais à lancer mplayer en asm, et j'ai vu qu'on pouvait faire ça en langage machine avec pointeur de fonction dans un code C, j'ai trouvé ça marrant donc j'ai fait mumuse :-)
0
lol
ok ben je comprend pas pourkoi ça marche chez toi
et pas chez moi alors, ça vient peut etre du kernel
merci de m'avoir aidé
salut
0
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 5 février 2025 1 526
25 sept. 2005 à 23:45
Bonne chance.
0