C – Exécuter des commandes Bash avec Execvp

Je veux écrire un programme Shellcode.c qui accepte en entrée un fichier texte contenant des commandes bash séparées par une nouvelle ligne et exécutant toutes les commandes du fichier texte.

echo Hello World mkdir goofy ls 

J’ai essayé celui-ci (juste pour commencer à s’exercer à l’une des fonctions d’exécution):

 #include  #include  void main() { char *name[3]; name[0] = "echo"; name[1] = "Hello World"; name[2] = NULL; execvp("/bin/sh", name); } 

Je reçois en retour

 echo: Can't open Hello World 

Je suis coincé avec la fonction execvp, où est-ce que je me suis trompé?

    Vous le faites mal.

    Le premier index de tableau est le nom du programme, comme expliqué dans la documentation :

    Les fonctions execv (), execvp () et execvpe () fournissent un tableau de pointeurs vers des chaînes terminées par un caractère nul qui représentent la liste d’arguments disponible pour le nouveau programme. Le premier argument, par convention, doit pointer vers le nom de fichier associé au fichier en cours d’exécution. Le tableau de pointeurs doit être terminé par un pointeur NULL.

    En outre, bash ne s’attend pas à un argument de forme libre comme celui-là, vous devez lui dire que vous allez passer des commandes à l’aide de l’option -c :

    Donc, vous avez besoin de:

     name[0] = "sh"; name[1] = "-c"; name[2] = "echo hello world"; name[3] = NULL; 

    Pour passer un script à bash sur la ligne de commande, vous devez append l’option ‘-c’ et transmettre l’ensemble du script en une seule chaîne, c’est-à-dire

     #include  #include  void main() { char *name[] = { "/bin/bash", "-c", "echo 'Hello World'", NULL }; execvp(name[0], name); } 

    Beaucoup de problèmes ici: La famille de fonctions exec() n’exécute pas plusieurs programmes – ces fonctions exécutent un seul programme et remplacent en mémoire le processus en cours d’exécution par le nouveau programme. Le tableau de chaînes terminé par un pointeur nul que vous transmettez à execvp est censé contenir les arguments de ligne de commande du programme exécuté par execvp .

    Si vous souhaitez exécuter plusieurs programmes, vous devez boucler chaque ligne et exécuter les programmes un par un. Mais vous ne pouvez pas utiliser execvp car cela remplace immédiatement le processus en cours d’exécution (votre programme C) par le processus exécuté via le shell, ce qui signifie que le rest de votre programme C ne sera jamais exécuté. Vous devez apprendre à utiliser fork() associé à execvp pour pouvoir exécuter des processus enfants. Vous appelez d’abord fork() pour créer un processus enfant, puis appelez execvp partir du processus enfant. Fork + Exec est une stratégie courante dans les environnements UNIX pour lancer d’autres processus à partir d’un processus parent.