linux c-请教为何会有segmentation fault错误(linux系统下c)

问题描述

请教为何会有segmentation fault错误(linux系统下c)

程序是要实现弱口令扫描的原型实现 包括能扫描两个词条连在一起的口令,大写首字母的口令和后面带数字的口令

用命令gcc -o crack -lcrypt crack.c 编译通过,但运行时出现segmentation fault,求问错在哪里?
我只改了int dict_crack(FILE *dict_fp,struct userinfo_struct userinfo); 这个函数,其他的都是书上的。

#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct userinfo_struct{
char user[128];
char salt[128];
char crypt_passwd[128];
};

int parse_shadowline(char *shadow_line,struct userinfo_struct *parse_result);
int dict_crack(FILE *dict_fp,struct userinfo_struct userinfo);

int parse_shadowline(char *shadow_line,struct userinfo_struct *parse_result){
char *p,*q;
if(shadow_line==NULL){
printf("Error shadow line input!n");
return -1;
}
p=shadow_line;
q=strchr(p,':');

if(!q){
printf("Error shadow file format!n");
return -1;
}
strncpy(parse_result->user,p,q-p);
parse_result->user[q-p]='';
p=q+1;
if(strncmp(p,"$6$",3)!=0){//有可能系统$$中的数字不一样

printf("Not encrypted by md5 algorithm.n");
return -1;
}
q=strchr(p+3,'$');
if(!q){
printf("Error shadow file format!n");
return -1;
}
strncpy(parse_result->salt,p,q-p+1);

parse_result->salt[q-p+1]='';
p=q+1;
q=strchr(p,':');
if(!q){
printf("Error shadow file format!n");
return -1;
}
strncpy(parse_result->crypt_passwd,p,q-p);
parse_result->crypt_passwd[q-p]='';
return 0;
}

int dict_crack(FILE *dict_fp,struct userinfo_struct userinfo){
char *md5_check;
int success_flag=0;
char one_word[256];
char one_word1[256];
char md5_code[256];
strcpy(md5_code,strcat(userinfo.salt,userinfo.crypt_passwd));

fseek(dict_fp,0,SEEK_SET);
while((fscanf(dict_fp,"%s",one_word))!=EOF){
md5_check=(unsigned char*)crypt(one_word,userinfo.salt);
if(strcmp(md5_code,md5_check)==0){
success_flag=1;
//printf("The passwd for user %s is %sn",userinfo.user,one_word);

return success_flag;
}
}

//重复的单词

fseek(dict_fp,0,SEEK_SET);
while((fscanf(dict_fp,"%s",one_word))!=EOF){

md5_check=(unsigned char*)crypt(one_word,userinfo.salt);
md5_check=strcat(md5_check,md5_check);//重复
if(strcmp(md5_code,md5_check)==0){
success_flag=1;
//printf("The passwd for user %s is %sn",userinfo.user,one_word);

return success_flag;
}
}

//大写

fseek(dict_fp,0,SEEK_SET);
while((fscanf(dict_fp,"%s",one_word1))!=EOF){
one_word[0]1=toupper(one_word1[0]);//使开头字母大写
md5_check=(unsigned char*)crypt(one_word,userinfo.salt);
if(strcmp(md5_code,md5_check)==0){
success_flag=1;
//printf("The passwd for user %s is %sn",userinfo.user,one_word);
return success_flag;

}
}

return success_flag;
}

int main(int argc,char * argv[]){
FILE *shadow_fp;
FILE *dict_fp;
char shadow_line[256];
struct userinfo_struct userinfo;
int SUCCESS=0;
if(argc !=3){
printf("Input format erro!Usage as:n");
printf("%s shadow _file dict_filen",argv[0]);
exit(1);
}
if((shadow_fp=fopen(argv[1],"r"))==NULL){
printf("Cannot open the shadow file.n");
exit(1);
}
if((dict_fp=fopen(argv[2],"r"))==NULL){
printf("Cannot open the dict file.n");
exit(1);
}
while((fscanf(shadow_fp,"%s",shadow_line))!=EOF){

if(parse_shadowline(shadow_line,&userinfo)!=0){
printf("Cannot parse the shadow line!n");
continue;
}

if(dict_crack(dict_fp,userinfo)==1)
SUCCESS=1;
}
if(SUCCESS==0)
printf("Sorr,no password cracked,please try with another dictionary!n");
fclose(dict_fp);
fclose(shadow_fp);
return 0;
}

解决方案

gdb attach上去查看出错调用堆栈

时间: 2024-10-28 06:42:43

linux c-请教为何会有segmentation fault错误(linux系统下c)的相关文章

【Oracle】安装完oracle 9i,执行sqlplus 遇到Segmentation Fault

安装完成oracle 9.2.0.4之后,执行sqlplus 命令时遇到Segmentation Fault 错误,查询 Metalink 是一个bug:Segmentation Fault When Execute Sqlplus, Oracle, Lsnrctl After New/Patchset Install [ID 316746.1] 对于新安装的软件或者打过补丁的oracle数据库(9.2.0.1 to 10.1.0.2,for Linux x86,Linux x86-64)都可能

sql语句解析-使用lex和yacc解析SQL语句,报错segmentation fault问题

问题描述 使用lex和yacc解析SQL语句,报错segmentation fault问题 我这有一个linux下c.c++多线程程序,使用lex和yacc解析SQL,程序执行较快时总是报错segmentation fault,执行非常慢时,可以解析好多sql语句,但是偶尔也会报segmentation fault错误. 跟踪是发现有个yyparse中的yyvas指针(YYSTYPE结构体)strval中有好多out of bound信息,不知道与这个有关系没有.有人遇到过这个类似问题吗?

Linux下调试段错误的方法[Segmentation Fault]--GDB

原文 1.段错误是什么? 段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址.访问了系统保护的内存地址.访问了只读的内存地址等等情况. A segmentation fault (often shortened to segfault) is a particular error condition that can occur during the operation of computer software. In short, a segmentation

linux c-Linux C 编程中segmentation fault (core dump)错误

问题描述 Linux C 编程中segmentation fault (core dump)错误 Linux C 小白,求大神指导,不胜感激.原代码在Windows下用VC++6.0编写,能正常运行,后复制到Ubuntu 12.04下,改了一部分命令,编译能通过,但在运行时报错segmentation fault (core dump).下面为代码: #include #include #include #include #include double num; int WriteDat(){

oracle 9.2.0.8 exp导出dmp导入报Segmentation fault/段错误故障解决

在9.2.0.8 rac环境中,使用exp导出来dmp文件任何报错(按单个表,按用户导出,使用tns方式远程exp导出),包括重启数据库后导出,无法导入到其他数据库中(本库,tns方式远程导入,ftp传输到远程导入,9i/10g/11g版本)报错类似有setillegal instruction(coredump),段错误,Segmentation fault等,以下列出来几个报错信息--导入11.2.0.2版本 Import: Release 11.2.0.2.0 - Production o

segmentation-justniffer Segmentation fault

问题描述 justniffer Segmentation fault 使用sourceforge的justniffer出现了这个问题,本人不懂C方面的,请教这种问题怎么解决: justniffer.sh: line 7: 28769 Segmentation fault justniffer -l "%source.ip , %dest.ip , %connection.time(0) , %request.timestamp , %response.time(0) , %response.si

linux-应用程序不能开机启动出现Segmentation fault,但手动执行没问题

问题描述 应用程序不能开机启动出现Segmentation fault,但手动执行没问题 我在飞凌的OK6410开发板上写了一个应用程序,环境是linux,让它开机就启动运行,前段时间用着一直没问题,都挺正常的.但是现在不能开机就运行了,出现Segmentation fault,开发板启动起来后,我手动执行,也能执行,一切正常.应用程序就是不能开机启动,谁遇见过这种情况 解决方案 开机启动的时候,是不是依赖的一些环境还没有准备好

printf-linux 下 segmentation fault (core dumped) 错误出在哪里

问题描述 linux 下 segmentation fault (core dumped) 错误出在哪里 #include #include int sum; void * runner(void * param); int main(int argc,char * argv[]) { pthread_t tid; pthread_attr_t attr; if(argc<2) { printf("the number of paraments shuold more than 1&quo

c语言-C语言segmentation fault?

问题描述 C语言segmentation fault? #include main(){ int M, N, T, S[M][N], B; scanf("%d%d%d", &M, &N, &T); int i, j; for (i=0;i<M;i++){ for (j=0;j<N;j++){ scanf("%d",&S[i][j]); }; }; if (T == 0){ for (i=0;i<M;i++){ for