Mac上的分段错误11,C ++ unsigned int声明

时间:2016-09-11 15:52:15

标签: c++ segmentation-fault

我试图强行使用简单的对称加密算法。 所以我这样做:

    #define MAX_LEN 100
        unsigned int i;
        char *message;
        char* cipher = readFileBytes("secret_msg.bin");
        for (i = 0; i <4294967295; i++){
                if (decrypt(cipher,i,message, 0) == true){
                    cout<<message<<endl;
                    cout<<"hacked!";
                    break;
                }
            }

我知道密钥是一些无符号整数。问题是我得到了分段错误,因为据我所知,我超出了分配的调用堆栈大小。如果我评论if语句并将其更改为cout<<i;,我可以看到我的for循环正在按预期运行。

这是我的解密代码:

bool decrypt(char *c, unsigned int k,char *m){
    int i;
    for (i=0;i<MAX_LEN; i+=4){
        m[i] = c[i] ^ (k&0x00ff);
        m[i+1] = c[i+1] ^ (k >> 8);
        m[i+2] = c[i+2] ^ (k >> 16);
        m[i+3] = c[i+3] ^ (k >> 24);
    }
    string result(c);
    for (int i = 0; i < result.length(); i++) {
        if (result[i] == 'j' && result[i+1] == 'u' && result[i+2] == 's' && result[i+3] == 't') {
            return true;
        }
    }
    return false;
}

编辑: 如果我注释掉解密的内部代码,它会起作用,当我首先添加for循环时,我开始收到错误。

EDIT2: 如果我尝试cout&lt;我得到Segmentation错误,当然它在这里是null。我可以cout&lt;

1 个答案:

答案 0 :(得分:2)

ciphermessage似乎是字符数组。我猜MAX_LEN是他们的大小。

如果是这样,您将超出decrypt()范围内的范围:您对i+3c的元素m进行了处理,其中i可以是{{} 1}}。所以你在数组的边界之外写了3个元素。这是缓冲区溢出和segfault最可能的原因。

要解决您的问题,请整理您的循环以确保MAX_LEN-1,其中i<message_size-3将是message_size内容的实际大小。

补充说明:

cipher的最后一个参数没用,因为你在循环开始时将它重置为0。

您应该向decrypt()传达实际大小的输入:在您的缓冲区中,加密的消息可能后面是垃圾,尝试解密它将是浪费时间。

此外,请记住,对于数组,decrypt()无法知道缓冲区的大小:decrypt()是指针sizeof(m)的大小。因此,我建议改为选择m

请注意,由于此std::string问题,decrypt()末尾的消息输出可能不会输出太多。

顺便说一句,您的解密方案显然使用块密码,块长度为4.因此检查sizeof是否是4的倍数是有意义的。或者您可以按顺序更改代码能够使用不完整的块。