Erreur de segmentation

kyo3100 Messages postés 521 Statut Membre -  
kyo3100 Messages postés 521 Statut Membre -
Bonjour à vous tous Ô grands gourous, cela faisait un moment que je n'avais pas eu besoin d'aide mais là j'ai un petit problème et je compte sur vous pour m'aider à le résoudre.

Donc voilà, j'ai compilé un programme avec gcc sous Linux, aucun probème, la compilation se déroule nickel.
Ensuite lorsque je veux lancer le programme dans la console je fais donc:

./"nom du programme"
et là il me met "Erreur de segmentation"

J'ai donc lancé le débugger gdb et il me trouve ça comme problème:

"Program received signal SIGSEGV, Segmentation fault.
0xb7da1b45 in fgets () from /lib/tls/i686/cmov/libc.so.6"

Un problème dans ma fonction fgets() et qui proviendrait d'une bibliothèque partagée??? sauf que la forme de ma fonction fgets est tout à fait correct et il n'y absolument aucunes fautes à l'intérieur.!

Donc voilà, j'attends vos lumières Ô grands gourous de la programmation en C ^^
Je tiens à préciser que les librairies stdio.h et stdlib.h sont biens incluses.

13 réponses

kilian Messages postés 8854 Statut Modérateur 1 526
 
Salut,

Peu de chances que l'erreur vienne de fgets mais plutôt de la fonction qui l'appelle.
Tu as certainement dépassé la taille de ton tampon ou encore passé un mauvais pointeur.
0
kyo3100 Messages postés 521 Statut Membre 367
 
Ok, je vais jeter un coup d'oeil dans la fonction qui l'appelle ;-)

Si j'ai encore un problème je te dis quoi, merci pour ta réponse.
0
kyo3100 Messages postés 521 Statut Membre 367
 
C'est encore moi! Tu m'excuseras mais j'ai rien trouvé d'anormal (je doit être un peu rouillé ^^")

Voilà le code source, c'est un programme développé par THC et qui teste la sécurité du ssh, je comptais l'utiliser pour tester mes connexions ssh sur mon réseau mais jusque là impossible de le lancer.

<---Début--->

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "/usr/include/openssl/ssl.h"
#include "/usr/include/openssl/err.h"
#include "/usr/include/openssl/evp.h"
#include "/usr/include/openssl/pem.h"

int
main(int argc, char *argv[])
{
FILE *fp = fopen(argv[1], "r");
EVP_PKEY *pk;
char *ptr = NULL;
char pwd[1024];

SSL_library_init();
pwd[0] = '\0';
while (1)
{
if (!fgets(pwd, sizeof pwd, stdin))
{
printf("Password not found.\n");
exit(0);
}
ptr = strchr(pwd, '\n');
if (ptr)
*ptr = '\0';
pk = PEM_read_PrivateKey(fp, NULL, NULL, (char *)pwd);
if (pk)
{
printf("THC THC THC THC THC THC THC THC THC\n");
printf("----> pwd is '%s' <-----\n", pwd);
printf("THC THC THC THC THC THC THC THC THC\n");
exit(0);
}
}

return 0;
}

<---Fin--->
0
kilian Messages postés 8854 Statut Modérateur 1 526
 
Un train peut en cacher un autre.
Je me demande si c'est pas un autre fgets, par exemple est-ce que PEM_read_PrivateKey n'appellerait pas fgets par hasard? Ca me semblerait logique vu le nom de la fonction et des paramètres qu'elle prend.

Pour le savoir quand tu es dans gdb, après être tombé sur ton erreur, tape bt poursavoir quelle est la fonction appelante. Si c'est PEM_read_PrivateKey c'est que tu as fait une mauvaise utilisation de la fonction (buffer trop petit ou que sais-je) :-)

Autre indice: vérifie que fp n'est pas égal à NULL, tu as peut être passé un mauvais chemin pour ton fichier.
0

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

Posez votre question
kyo3100 Messages postés 521 Statut Membre 367
 
Je te met ce que gdb m'a affiché après la commande "bt"

Program received signal SIGSEGV, Segmentation fault.
0xb7dc9b45 in fgets () from /lib/tls/i686/cmov/libc.so.6
(gdb) bt
#0 0xb7dc9b45 in fgets () from /lib/tls/i686/cmov/libc.so.6
#1 0xb7cc83f6 in ?? () from /usr/lib/i686/cmov/libcrypto.so.0.9.8
#2 0xb7cc6981 in BIO_gets () from /usr/lib/i686/cmov/libcrypto.so.0.9.8
#3 0xb7cfe5a0 in PEM_read_bio () from /usr/lib/i686/cmov/libcrypto.so.0.9.8
#4 0xb7cffcf8 in PEM_bytes_read_bio ()
from /usr/lib/i686/cmov/libcrypto.so.0.9.8
#5 0xb7d0335f in PEM_read_bio_PrivateKey ()
from /usr/lib/i686/cmov/libcrypto.so.0.9.8
#6 0xb7d036d9 in PEM_read_PrivateKey ()
from /usr/lib/i686/cmov/libcrypto.so.0.9.8
#7 0x08048743 in main (argc=-2082109099, argv=0x758918ec) at ssh-crack.c:55

Apparemment tu as raison, on dirait que c'est PrivateKey qui appelle fgets, un conseil??? lol
0
kilian Messages postés 8854 Statut Modérateur 1 526
 
Alors soit ton tampon est trop petit, en ce cas il faut voir avec la documentation de la fonction. Je connais pas bien OpenSSL alors bon :-)
Ou bien ton pointeur de fichier est foireux (égal à NULL ?) donc là faudra plutôt vérifier le chemin vers le fichier que tu passes en paramètre de ton programme :-)

Je remarque dans ton premier message que tu lances ton programme sans nom de fichier en paramètre. Ca expliquerait tout :-)
0
kyo3100 Messages postés 521 Statut Membre 367
 
Ok, je vais essayer de voir tout ça(ça va me demander un peu de tps lol)
Je te remercie en tout cas ;-)
0
kilian Messages postés 8854 Statut Modérateur 1 526
 
Mais c'est un plaisir :-)
0
kyo3100 Messages postés 521 Statut Membre 367
 
Lol, et bien en fait je vais te demander une dernière faveur désolé xD

J'ai trouvé le prototype de la fonction PEM_read:

IMPLEMENT_PEM_read_fp(name, type, str, asn1)

Et celui de PEM_read_PrivateKey:

PEM_read_PrivateKey(fp,x,cb,u) (EVP_PKEY *)PEM_ASN1_read( \

Eclaire moi encore une fois stp! ^^
0
kilian Messages postés 8854 Statut Modérateur 1 526
 
Tu n'as pas à t'en soucier, c'est PEM_read_PrivateKey qui s'occupe de ça, toi tu as juste à vérifier que tu lui passe un pointeur de fichier et un buffer correct.
Comme je t'ai dit vérifie que ton fichier est correct, est ce que tu passes un chemin vers un fichier correct en paramètre de ton programme.

Je te laisse, je vais au zoo d'Amneville, y'aura des ours et des loups et ce sera cool.
Je reviens ce soir, si tu as un soucis n'hésite pas à poster sur cette discussion, je regarderai.
0
kyo3100 Messages postés 521 Statut Membre 367
 
Ok ok, bonne visite au zoo!!!

Merci pour ton aide et à ce soir peut être ;-)
0
kyo3100 Messages postés 521 Statut Membre 367
 
Re, j'espère que ta visite au zoo était cool, en tout cas j'ai tjs pas trouvé.

D'ailleurs ça commence à doucement me souler ^^ parce que là je sais pas, je vois pas, j'arrive même pas à comprendre où pointe les pointeurs et je comprends pas les paramètres qu'attend PEM_read.
J'ai essayé de changer le nom du fichier, d'en créer un nouveau, rien ça fonctionne pas, je dois avouer que j'en ai marre là xD
J'ai même fait une petite modif histoire de voir si ça pouvait changer quelque chose mais rien:

"FILE *fp = NULL;
fp = fopen(argv[1], "r");"

J'ai essayé de changer le nom du fichier, en plus lorsque je vois qu'il veut ouvrir argv, c'est la fonction main non?

Désolé mais là je vois pas, vraiment ^^
0
kilian Messages postés 8854 Statut Modérateur 1 526
 
Ok.
Avant d'appeler la fonction PEM. Est ce que fp est égal à NULL?
Et qu'est ce que ça donne avec un buffer bien plus grand?
0
kyo3100 Messages postés 521 Statut Membre 367
 
Bonjour, désolé mais je ne sais pas si fp est égal à NULL, fp est le pointeur de type FILE qui pointe sur mon fichier donc je ne pense pas qu'il soit nul.
Quand au buffer je crois que ça n'a rien changé ou alors j'ai mal fait la manip.
0
kilian Messages postés 8854 Statut Modérateur 1 526
 
Si, fp est égal à NULL lorsqu'il y a une erreur lors de l'ouverture. Suffit de tester la valeur de fp après l'appel à fopen.
0
kyo3100 Messages postés 521 Statut Membre 367
 
Ok, je vois comment le tester, avec un exit(0) si jamais l'ouverture échoue ;-)

Je fais le test et je te dis quoi.

Merci pour ta patience ^^
0