[C] Saisie gets depuis un autre programme

Résolu/Fermé
Lum - 22 mai 2009 à 13:58
 Lum - 22 mai 2009 à 20:10
Bonjour,

J'aimerai réaliser un programme qui automatise la saisie de caractères (une sorte de bot) sur un gets().
Je m'explique :
J'ai un premier programme que je ne peux pas modifier, et qui utilise gets() à un moment donné du programme.
Quelle méthode dois-je utiliser pour saisir dans ce gets(), depuis un autre programme ?
J'ai essayer de réaliser un fork(); et ensuite execl() sur le processus fils. Pour permettre finalement au processus père d'utiliser un printf(). En pensant que le flux de sortie serait redirigé vers le flux d'entrée du gets() mais sans succès.

Quelqu'un à une idée ?

9 réponses

j'ai finallement résolu mon problème : C'est effectivement une histoire de redirection.

Il s'agit en fait tout simplement de réaliser un programme qui réalise un printf(); de la chaîne désirée.
et de taper dans le terminal programme_avec_printf | programme_cible

Et alors même les caractères non imprimables sont transmis.
2
Utilisateur anonyme
22 mai 2009 à 14:23
Salut,

Je ne pense pas que ce soit possible avec ta méthode. Tu peux communiquer entre un père et ses fils en utilisant des pipes par exemples.

Mais pour faire communiquer deux programmes entre eux il faut utiliser des chouquettes enfin des sockets pour être plus précis ^^.

=> https://broux.developpez.com/articles/c/sockets/

Bon courage =) tu en auras besoin avec les sockets !
0
Merci, mais ce n'est pas une solution adaptée, en effet je ne peux pas modifier l'un des deux programmes. :/
0
Aucune idée ? J'imagine qu'une telle fonction doit exister...
Ou alors est-il obligatoire de passer par un Hook clavier et simuler l'appui de certaines touches ?
Même cette solution n'est pas valable puisque dans mon cas il s'agit de la chaine \x01\x02\x03\x05 qui sont des caractères non imprimables.

Un peu d'aide svp :)
0
Utilisateur anonyme
22 mai 2009 à 17:01
Perso je vois ... si tu n'as pas la main sur l'autre programme ça va être difficile... tu peux peut-être stocker le résultat dans un fichier texte et le lire après ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
22 mai 2009 à 17:05
Salut
As-tu essayé avec les redirections ?
Par exemple, tu mets dans un fichier toutes les lignes que tu veux entrer dans tes gets (attention, fonction obsolète).
Et en appelant : programme < fichier
Toutes les lignes du fichier seront validées dans ton programme.
Cdlt
0
C'est effectivement une solution mais le problème reste le même les caractères sont non-imprimable.

Je détaille d'avantage mon problème : je tente de réaliser un Buffer overflow sur une fonction gets (D'ou le fait quelle soit obsolète).

J'ai une première variable de type int (4bytes) dans le fond de la pile suivit de mon buffer
gets copie en mémoire dans le buffer. Lorsque la longueur est dépassée j'écris dans mon int précédent.

Jusqu'à la tout va bien : J'ai réussi lorsqu'il s'agissait de mettre 0x41424344 soit ABCD. J'entre manuellement dans le gets 'A'*la taille de buffer suivit de ABCD.

Mais maintenant je dois réaliser le même exemple avec 0x01020305 soit des caractères que je ne peux PAS rentrer manuellement.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
22 mai 2009 à 18:41
Attention un int ce n'est pas forcément 4 bytes.
Ce que je voulais dire avec la méthode du fichier :
Tu crées ton fichier avec un programme dans lequel tu peux mettre tes caractères non-imprimables (probablement ton shellcode ^^).
Et après, tu retestes la commande ci-dessus.
0
J'ai tenté la méthode des redirections, mais comment l'appliquer "dans" le programme ? Je veux dire par la que main ne prend pas d'arguments (pas de int argc, char **argv). Comment réaliser la redirection dans ce cas ?
Si je tape "< crafted_buffer", gets comprends "< crafted_buffer" comme une chaîne de caractère.

J'ai réalisé un prog comme tu m'as dit qui construit un fichier avec 80x'A' suivit de \x01\x02\x03\x05. Mais quand je copie cette ligne et la colle dans le terminal au moment du gets, je retourne directement dans le terminal sans même avoir appuyé sur entrée. Pas d'erreur rien. De même quand j'essaye simplement de copier la chaîne dans le terminal.

Je pense que c'est dû à un des caractères spéciaux qui doit correspondre à un caractère de formatage ou autre.

Une autre idée ? J'ai passé la journée à chercher, je commence à me décourager :/
0
Je tiens un début de quelque chose, mais c'est bien maigre.
En cherchant encore un peu :
Je parviens à rentrer les 80 'A' suivit de \x01\x02 qui correspondent respectivement à :
SOH (Start of heading)
STX (Start of text)
Mais je plante à \x03 = ETX (End of text)
Qui fait croire à gets() que j'ai fini de saisir, d'où le retour au terminal.
0