troyan à mon boulot

Moderator: Mod

troyan à mon boulot

Postby DVA2TLSE » Sat Sep 17, 2011 11:28 am

Bonjour, je cherche à créer un programme en C qui exécute les commandes que j'envoie dans un mèl. (pour une HP 9000 sous unix) Ce programme, qui fait déjà une partie du boulot, se connecte à un serveur pop sur un compte que j'ai crée pour l'occasion; il y récupère les messages et reconnait par leur "Subject: HHH" ceux qui contiennent des commandes que je voudrais faire éxécuter à mon boulot; quelque part dans mon programme, une fois qu'il est connecté et a reconnu un mèl intéressant, j'ai :

nr = read(fd, ptr, nl);

avec :
nr le nombre d'octets lus,
fd le socket vers le serveur pop,
ptr un pointeur vers le début du texte du mèl,
nl le nombre d'octets qu'on désire lire.

Comment faire pour que les différentes lignes lues soient exécutées une à une sur la machine qui reçoit le mèl ?
merci de m'aider à avancer,
David
DVA2TLSE
Projets
 
Posts: 69
Joined: Sat Oct 04, 2008 2:59 pm
Location: Toulouse

Postby Manu404 » Sat Sep 17, 2011 7:00 pm

en C tu peu utiliser la fonction system().
Voici le prototype :
int system (const char *command);

Pour la lecture une a une, tu as ton buffer avec le corp du mail.
Suffit de faire le read caractère par caractère que tu stock dans un autre buffer jusqu'a la rencontre de \n . Une fois \n rencontré, tu appel system avec le buffer contenant la ligne , puis tu recommence, jusqu'au EOF
User avatar
Manu404
 
Posts: 2219
Joined: Tue Feb 26, 2008 3:44 pm
Location: ::1:

Postby DVA2TLSE » Sun Sep 18, 2011 8:07 am

Ok merci,
C'est tout con en effet alors; je vais essayer de coder ça proprement (je connais assez bien le fortran par mon boulot, mais qu'à peine le C) et hop.
super, merci encore,
David
DVA2TLSE
Projets
 
Posts: 69
Joined: Sat Oct 04, 2008 2:59 pm
Location: Toulouse

Postby DVA2TLSE » Thu Sep 29, 2011 4:43 pm

Bonjour,
j’ai essayé de coder pas trop salement ce que tu m’as conseillé, et ça marche pas mal jusqu’au moment fatidique où j’utilise la fonction “system“. En effet, voici ce que ça donne, avec quelques commentaires après le // :

[code]"ppli: RETR: tcmd="/bin/hostname // tcmd est declare en unsigned char tcmd[PACKET_SIZE+1];
"ppli: RETR: scmd="/bin/hostname // scmd est déclaré en char *scmd;
")pli: RETR: Ok ici AVT system("/bin/hostname // résultat de printf("appli: RETR: Ok ici AV system(\"%s\")\n", scmd);
/bin/hostname // résultat de printf("%s\n", scmd);
sh: /bin/hostname^M: not found. // résultat de system(scmd);
")pli: RETR: Ok ici APR system("/bin/hostname // résultat de printf("appli: RETR: Ok ici APR system(\"%s\")\n", scmd);
/bin/hostname // résultat de printf("%s\n", scmd);

"ppli: RETR: tcmd="/bin/date
"ppli: RETR: scmd="/bin/date
")pli: RETR: Ok ici AVT system("/bin/date
/bin/date
sh: /bin/date^M: not found.
")pli: RETR: Ok ici APR system("/bin/date
/bin/date

"ppli: RETR: tcmd="/bin/echo toto
"ppli: RETR: scmd="/bin/echo toto
")pli: RETR: Ok ici AVT system("/bin/echo toto
/bin/echo toto
toto // YOUPI
")pli: RETR: Ok ici APR system("/bin/echo toto
/bin/echo toto[/code]

J’avais envoyé un mèl tout con sur le compte que j’ai créé pour ça, avec trois commandes :

[code]/bin/hostname
/bin/date
/bin/echo toto[/code]

On s’aperçoit que la troisième commande a bien marché, mais pas les deux premières. la fonction system() a du mal avec la fin de la chaine, comme quand on édite avec vi un texte qui n'est pas unix; et il se pose le même problème relatif aux fins de chaines avec la fonction printf() qui imprime en début de ligne le guillemet " qui devrait être mis en fin de ligne.
Et pourquoi l'echo marche-t'il alors que pas les autres ?
merci de m'aider à dépatouiller tout ça,
David
DVA2TLSE
Projets
 
Posts: 69
Joined: Sat Oct 04, 2008 2:59 pm
Location: Toulouse

Postby Manu404 » Thu Sep 29, 2011 8:32 pm

Ton truc est illisible :/
J'ai essayé de viré ce qui n'était pas nécéssaire :
[code:1:3ae08564b4]Appli: tcmd="/bin/hostname
Appli: scmd="/bin/hostname
Appli: Appel system()
/bin/hostname // résultat de printf("%s\n", scmd);
sh: /bin/hostname^M: not found. // résultat de system(scmd);

Appli: tcmd="/bin/date
Appli: scmd="/bin/date
Appli: Appel system()
/bin/date
sh: /bin/date^M: not found.

Appli: tcmd="/bin/echo toto
Appli: scmd="/bin/echo toto
Appli: Appel system()
/bin/echo toto
toto // YOUPI
[/code:1:3ae08564b4]
Alors, il semble simplement que un ^M se soit rajouté a la fin de tes tableaux de caractères. fait une fonction de nettoyage et ça devrais aller.
User avatar
Manu404
 
Posts: 2219
Joined: Tue Feb 26, 2008 3:44 pm
Location: ::1:

Postby DVA2TLSE » Fri Sep 30, 2011 5:07 pm

Je te remercie; en effet il y avait un ^M en fin de ligne qui foutait la M..., mais j'ai contourné le problémé en envoyant un mèl constitué de la façon suivante puisque la commande "echo" était la seule qui marchait bien :

/bin/echo `hostname`
/bin/echo `echo toto > /tmp/tmp`
/bin/echo `date`

Et ça marche bien, j'ai bien en echo le résultat des commandes qui m'intéressent, et en particulier j'ai bien le fichier /tmp/tmp qui contient "toto" sur une ligne. Donc YOUPI.
David
DVA2TLSE
Projets
 
Posts: 69
Joined: Sat Oct 04, 2008 2:59 pm
Location: Toulouse


Return to C/C++

Who is online

Users browsing this forum: No registered users and 1 guest

cron