IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Appel système passage argument


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Par défaut Appel système passage argument
    Bonjour,

    j'essaie de réaliser un petit programme assez simple avec un appel system sous linux.

    Voici le programme qui fait l'appel système :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #include <stdio.h>
    #include <stdlib.h>
    #include <crypt.h>
    #include <unistd.h>
    #include <string.h>
     
    int main (void) 
    {
    	char pid[16];
     
    	// get pid of this programme and increment
    	int intPid = getpid() + 1;
    	printf("PID : %d\n",intPid);
     
    	// prepare the call system
    	char str1[50] = "./niveau4 ";
     
    	// change int to string
    	sprintf(pid, "%d", intPid);
     
    	// prepare the pass
    	char pass[33];
    	sprintf(pass, "%s", crypt(pid, "$1$awesome"));
     
    	// concat the call with the argument
    	strcat(str1,pass);
     
    	// check the value before call to system
    	printf("String avant appel : \n%s\n", str1);
     
    	// proceed to call
    	system(str1);
     
    	return 0;
    }
    Et le programme qui est appelé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <crypt.h>
     
     
    int main (int argc, char *argv[]) {
      char pid[16];
      snprintf(pid, sizeof(pid), "%i", getpid());
     
      // print the value passed in argument (problem appear here)
      printf("Argument: %s\n", argv[1]);
     
      if(argc != 2) 
      {
      	return 0;
      }
     
      // print the argument attempted
      printf("\nCrypt %s\n",  crypt(pid, "$1$awesome"));
     
      // check if pass is correct
      if(strcmp(argv[1], crypt(pid, "$1$awesome")) == 0) 
      {
        printf("WIN!\n");
        system("/bin/sh -p");
      }
      else{
        printf("phail... :/\n");
      }
    }
    Et voila ce qui sort sur la console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PID : 12219
    String avant appel : 
    ./niveau4 $1$awesome$cKZdLD/khV9HjalUTy1Z0/
    Argument : /khV9HjalUTy1Z0/
     
    Crypt $1$awesome$cKZdLD/khV9HjalUTy1Z0/
    phail... :/
    Comme on peut le voir, le string avant appel à l'air correct mais seul une partie du string est récupérer dans le deuxième programme.

    Quelqu'un voit-il mon erreur ?

    Merci d'avance de votre aide

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Je ne suis pas un spécialiste de Linux, mais à mon avis, lorsque tu balances la commande via system, le shell, avant d'exécuter la commande, doit probablement interpréter tous tes dollars (qu'il voit comme des variables : $1 , $awesome et $cKZdLD) en remplaçant par la valeur adéquate. Je te suggère d'entourer l'argument par des apostrophes (afin que $ ne soit pas interprété).

  3. #3
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Par défaut
    Merci,

    comment n'y ai-je pas pensé

    C'est exactement ça !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Système] passage carac spéciaux en parametre
    Par pimter dans le forum Langage
    Réponses: 7
    Dernier message: 27/06/2006, 16h48
  2. Réponses: 3
    Dernier message: 20/06/2006, 07h06
  3. appel explorer avec arguments
    Par mick84m dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 31/05/2006, 15h23
  4. [UBUNTU] Ajout nouvel appel système ?
    Par [Margot] dans le forum Ubuntu
    Réponses: 5
    Dernier message: 11/05/2006, 14h11
  5. appel système opendir dans thread
    Par madimane dans le forum POSIX
    Réponses: 2
    Dernier message: 14/04/2006, 05h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo