函数调用期间核心转储,找不到问题所在

标签 c cryptography core shadow

晚上好,我为我的大学项目编写的 C 代码有问题。

这是一个密码学类,我正在制作一个脚本,该脚本将从 Shadow.txt 中获取散列密码及其盐,然后将散列密码与 .txt 中可能的密码进行比较。 直到我调用 cryptowithTXT() 函数为止,一切都运行良好。它只是给我带来了核心转储问题。我在函数内部放置了一些打印内容,以查看它在哪里崩溃,但它从不打印任何内容,这意味着它只是在调用该函数时崩溃,但我不知道为什么。

如果您对我做错了什么并导致其崩溃有任何提示,我将非常感激。如果您对我的代码质量还有任何其他建议,请随时给我一些建议,我正在努力提高 C 语言水平,因此我很愿意接受批评。

这是我的主要内容。

#include <stdio.h>
#include <crypt.h>
#include <string.h>

int getSaltnPassword(char* name,char* salt,char* pwd);
int decryptwithTXT(char* pwd,char* hpwd,char* salt,char* file);

int main()
{
    int x;
    char salt[8],hashedpwd[18],pwd[255],name[255],answer,flag,filename[25];
    do{
        printf("   Give username of targeted account.\n");
        scanf("%s",name);
        if (getSaltnPassword(name,salt,hashedpwd)==1){
            printf("Salt: %s\nHashed Password: %s\n",salt,hashedpwd);
            printf("   Proceed with attack on selected user? Y/N \n");
            scanf("%c",&answer);
            scanf("%c",&answer);
        }
        else
            printf("User not found, try again.\n"); 
    }while (answer!='Y'&&answer!='y');
    printf("   Choose one of the following:\n");
    printf("   a) Attack using datamined passwords.\n");
    printf("   b) Dictionary attack.\n");
    printf("   c) 4 character brute-force attack\n");
    scanf("%c",&flag);
    scanf("%c",&flag);
    switch(flag){

        case 'a':
            printf("Datamine\n");
            x=decryptwithTXT(pwd,hashedpwd,salt,"tom_datamine.txt");
        case 'b':
            printf("Dictionary.\n");
        case 'c':
            printf("Brute force.\n");
    }
return 0;
}

这是我的 cryptowithTXT 函数。现在我只想让它打印 tom_datamine.txt 中的所有密码

int decryptwithTXT(char* pwd,char* hpwd,char* salt,char* file){
    printf("entered function");
    int flag=0;
    FILE *fp;
    char temppwd[255];
        printf("declarations");
    fp=fopen(file,"r");
        printf("fopen");
    while(!feof(fp)){
            printf("loop");
        fgets(temppwd,255,(FILE*) fp);
            printf("fgets");
        printf("%s",temppwd);
            printf("print pwd");
    }
    fclose(fp);
    return 0;
}

这是从shadow.txt 中获取salt 和散列密码的函数。目前它按预期工作。

int getSaltnPassword(char* name,char* salt, char* pwd){
    FILE *fp;
    char line[255],name_txt[255];
    int i,salta,saltb,pwda,pwdb;
    int j=0;
    fp=fopen("my_shadow.txt","r");
    while(!feof(fp)){
        i=0;
        fgets(line,255,(FILE*) fp);
        while (line[i]!=':'){
            name_txt[i]=line[i];    
            i++;
        }
        name_txt[i] = '\0';
        if (strcmp(name_txt,name)==0){
            printf("User found.\n");
            salta=i+4;
            saltb=i+12;
            for (i=salta;i<saltb;i++){
                salt[j]=line[i];
                j++;
            }
            salt[8]='\0';
            pwda=saltb+1;
            pwdb=pwda+18;
            j=0;
            for (i=pwda;i<pwdb;i++){
                pwd[j]=line[i];
                j++;
            }
            pwd[18]='\0';
            fclose(fp);
            return 1;
        }
      }
    fclose(fp); 
    return 0;
}

这就是我的 Shadow.txt 的样子

babis:$1$asff83lt$gggggg9nvR6civ7fZP.tt/:
anna:$1$kwif83lt$ZaNUkA9nvR6civ7fZP.tt/:

这就是我的 tom_datamine.txt 的样子。

tom
marousi
anna
pinkfloyd
bowling
tommarousi
tomarousi
tomanna
tompf
tompinkfloyd
bowlingfloyd
pink floyd
tombowling

最佳答案

因为输出位于缓冲区中,直到通过已满、换行符或 fflush(stdout) 将其释放到设备,因此当程序崩溃时,永远不会打印消息。请注意,这是一个频繁发生的情况。看到写错了,说 printf("\nMy message"); 而不是 printf("My message\n")

因此,我放入的调试 printf 从未打印出来,我认为我的函数调用有问题,但毕竟,这是一次错误的文件读取。

感谢 @WeatherVane 的回答,他在解决这个问题以及在评论部分提高了我的编程知识方面提供了宝贵的帮助。

关于函数调用期间核心转储,找不到问题所在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43822797/

相关文章:

encryption - 为什么使用 3DES 和 Blowfish 而不是 AES

c - WCOREDUMP(status) 似乎总是返回 true,即使该功能已关闭

java - 将逗号分隔的字符串转换为最后一个逗号的列表

c - 有限状态机中的数组、指针和指向函数的指针

c - 如何在 c 中迭代地将文本附加到 .txt 文件

c - 为什么我们需要 "-pthread"标志来编译 c 文件

encryption - 具有任意长度明文的 AES 测试向量

git - GIT中的 'Commit ID'和 'SHA1 Hash'有什么区别?

linux:如何生成核心文件?

c - 扫描二维数组列