[C] Saisie gets depuis un autre programme
Résolu/Fermé
A voir également:
- [C] Saisie gets depuis un autre programme
- Programme demarrage windows 10 - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
- Saisie gestuelle iphone - Guide
- Saisie vocale sms - Guide
- Desinstaller un programme - Guide
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.
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.
Utilisateur anonyme
22 mai 2009 à 14:23
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 !
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 !
Merci, mais ce n'est pas une solution adaptée, en effet je ne peux pas modifier l'un des deux programmes. :/
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 :)
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 :)
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
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
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
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.
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.
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
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.
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.
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 :/
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 :/
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.
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.