2009-12-23 5 views
1

Je veux invoquer un shell dans le programme C par execve:execve invoquant

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 

main() 
{ 
     char* path = "/bin/sh"; 
     int err = execve(path, &path, NULL); 
     printf("%d\n", err); 
     printf("%s\n", strerror(errno)); 
     printf("%x, %x\n", path, &path); 
} 

Cependant, la sortie est:

-1 
Bad address 
80485c0, bf816f4c 

Répondre

10

Parce que vous n'êtes pas l'envoi d'un NULL fin liste des arguments. Vous avez besoin:

char* path[2]; 
path[0] = "/bin/sh"; 
path[1] = NULL; 
int err = execve(path[0], path, NULL); 
0

Essayez ceci:

execl(path, path, NULL) 

La famille de fonctions exec exécutera automatiquement un shell si le programme est un script plutôt que d'un fichier image de processus. Donc, vous pourriez être en mesure de remplacer "chemin" avec le chemin d'accès du script.

5

Le deuxième argument à execve est défini comme étant une liste de chaînes terminée par NULL, donc vous ne pouvez pas simplement passer l'adresse path. Il attend un tableau comme celui-ci, avec l'être d'entrée finale NULL:

arg[0] = "/bin/ls" 
arg[1] = "-l" 
arg[2] = "/usr/include/std*" 
arg[3] = NULL 

La raison pour laquelle il échouait avec un mauvais pointeur est que execve aurait regardé chaque mot suivant path pour trouver les arguments et le traitement de chaque mot comme un pointeur jusqu'à ce qu'il arrive au premier mot 0. Puisque path était seul sur la pile, il aurait essayé d'interpréter tout ce qui était en mémoire après la pile au-delà de path comme un pointeur de chaîne.

La solution est simple: vous devez construire un tableau de paramètres et ajouter un terminateur NULL (puisqu'il est de longueur variable). L'exemple fixe est ci-dessous (avec quelques avertissements pris en charge):

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <unistd.h> 
#include <string.h> 

int main() 
{ 
    char* path[] = { "/bin/sh", NULL }; 

    int err = execve(path[0], path, NULL); 

    printf("%d\n", err); 
    printf("%s\n", strerror(errno)); 
    printf("%p, %p\n", path, &path); 

    return 0; 
} 
Questions connexes