首页 > 解决方案 > 这提出了分段错误(核心转储)

问题描述

所以我现在正在研究一个 ctf,这基本上迫使我在 C 中做一些事情。它是一个基本程序,用于检查 check_password 函数的输出是否等于哈希码。我决定暴力破解这个,所以我写了一些代码。可能有一些更简单的方法可以做到这一点,我想稍微测试一下我的编码技能,也许在此过程中学习更多关于 C 的知识。所以我编写了这段代码,它将给 check_password 函数的参数递增,每个循环加 1,然后让它将输出与哈希码进行比较。当我运行它时,它会引发“分段错误(核心转储)”错误。

我已经尝试过用谷歌搜索这个问题,但我似乎不明白我的代码中的具体错误是什么。这是我的代码:

#include <stdio.h>
#include <stdbool.h>
unsigned long hashcode = 0x21DD09EC;
unsigned long check_password(const char* p){
        int* ip = (int*)p;
        int i;
        int res=0;
        for(i=0; i<5; i++){
                res += ip[i];
        }
        return res;
}

int main()
{
    const char* i = 0;
    long current_guess;
    bool found = false;
    while(!found) {
        current_guess = check_password(i);
        if(current_guess == hashcode) {
            printf(i);
            found = true;
            break;
        }
        else {
            i++;
            continue;
        }
    }

    return 0;
}

所以它应该遍历所有选项,并在完成后打印出 i ,除非它抛出错误。帮助将不胜感激。

这是我试图获取密码的程序的代码顺便说一句

#include <stdio.h>
#include <string.h>
unsigned long hashcode = 0x21DD09EC;
unsigned long check_password(const char* p){
        int* ip = (int*)p;
        int i;
        int res=0;
        for(i=0; i<5; i++){
                res += ip[i];
        }
        return res;
}

int main(int argc, char* argv[]){
        if(argc<2){
                printf("usage : %s [passcode]\n", argv[0]);
                return 0;
        }
        if(strlen(argv[1]) != 20){
                printf("passcode length should be 20 bytes\n");
                return 0;
        }

        if(hashcode == check_password( argv[1] )){
                system("/bin/cat flag");
                return 0;
        }
        else
                printf("wrong passcode.\n");
        return 0;
}

标签: c

解决方案


好的,我原来的答案不是你想要的答案。既然你已经澄清了:

该函数在将指针check_password转换为指针时做了一些“有点顽皮”的事情,但这没关系。它至少需要 20 个字符,以便可以将字符串“解释”为 5 个整数的数组。const char*int*

调用此函数时,需要向其传递一个字符串(至少 20 个字符)。在main您显示的示例中,此字符串是argv[1],它是程序名称之后的第一个参数;因此,如果您使用“checkpw ABCD1234WXYZ5678aaaa”运行程序,那么 ABC... 字符串将是传递给函数的数据。

这有帮助吗?


推荐阅读