Comment coder un execve en appel système

Fermé
alex6943 Messages postés 2 Date d'inscription vendredi 16 janvier 2009 Statut Membre Dernière intervention 28 janvier 2009 - 16 janv. 2009 à 12:50
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 - 28 janv. 2009 à 17:55
Bonjour,

Je suis étudiant en informatique, et j'ai un projet à effectuer.
Je dois coder un appel système qui effectue un execve.
J'ai déjà penser à utiliser la fonction do_execve() mais elle prend en entrée un pt_reg que je ne sais pas initialiser.
De plus en cherchant un peu j'ai trouvé deux implémentations différentes, mais qui me donnent toutes deux un segmentation fault quand je lance l'appel système:

1 j'ai essayé de reprendre le code de sys_execve;

et

2 j'ai essayé un

mm_segment_t old_fs=get_fs();
set_fs();
do_execve("/bin/sh", argv, env, regs);
set_fs(old_fs);

J'ai besoin d'aide. Merci par avance à tous ceux qui liront et se pencheront sur mon problèmes!
Dites moi au moins si ça peut marcher!

2 réponses

0x0syscall Messages postés 85 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 30 juin 2009 5
28 janv. 2009 à 13:52
Dans ton projet tu peux le coder en asm x86 ?
Si c'est le cas.

regarde quelque exemple sur ce site http://pollydevstorm.zapto.org/asm/index.html
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
28 janv. 2009 à 14:36
do_execve/sys_execve sont des fonctions du kernel. Tu n'es pas sensé pouvoir y accéder, à moins que tu sois en train de coder au niveau du noyau?

En fait quand tu appelles la fonction execve côté utilisateur, tu va basculer en mode kernel (interruption appel système) puis le kernel va executer sys_execve() qui va lui même appeller do_execve() etc....

Mais côté utilisateur, ce dont tu as besoin c'est d'execve(), par contre si tu es dans le noyau (Linux) et que tu veux executer un programme utilisateur alors il faut passer par d'autres solutions tel que khelper en utilisant la fonction
call_usermodehelper()
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
28 janv. 2009 à 14:44
Et de manière générique, pour faire un appel système côté utilisateur, il y a la fonction syscall:
https://linux.die.net/man/2/syscall
0
alex6943 Messages postés 2 Date d'inscription vendredi 16 janvier 2009 Statut Membre Dernière intervention 28 janvier 2009 > kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016
28 janv. 2009 à 17:46
Merci, c'était call_usermodehelper qu'il me fallait.
Le but du jeu était d'implémenter un system call (au niveau du noyau), qui lançait un executable côté utilisareur.
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527 > alex6943 Messages postés 2 Date d'inscription vendredi 16 janvier 2009 Statut Membre Dernière intervention 28 janvier 2009
28 janv. 2009 à 17:55
Ok, j'espère que tu utilises un noyau 2.6 parce que je ne sais pas si ça existe dans le 2.4 (comme ta config dit que tu as un 2.4).

Tu trouveras quelques détails sur cette fonction dans le repertoire des sources du noyau:
include/linux/kmod.h

Et l'idéal est de faire un grep pour trouver des fichiers qui l'utilisent.
0