当我偶然发现时,我正在通过在线课程进行练习,我删除了几乎所有内容的代码,但这仍然在发生,我的代码如下:
static const char alphabet1[] = "abcd";
void mycrack(char* hashed)
{
char pass[4];
char salt[2];
for (int a = 0, size = sizeof(alphabet1); a < size - 1; ++a) {
for (int b = 0, size = sizeof(alphabet1); b < size - 1; ++b) {
for (int c = 0, size = sizeof(alphabet1); c < size - 1; ++c) {
for (int d = 0, size = sizeof(alphabet1); d < size - 1; ++d) {
pass[a] = alphabet1[a];
pass[b] = alphabet1[b];
pass[c] = alphabet1[c];
pass[d] = alphabet1[d];
salt[0] = '5';
salt[1] = '0';
printf("salt:%s \n",salt);
}
}
}
}
}
int main(int argc, string argv[1])
{
mycrack(argv[1]);
return 0;
}
但是如果printf应该为每次尝试打印盐(50),我会得到盐+通行证:ex
salt:50a
salt:50ab
salt:50abc
salt:50abcd
salt:50abcd
salt:50abcd
salt:50abcd
salt:50abcd
salt:50abcd
salt:50abcd
salt:50abcd
请注意,我知道我不应该在循环中重新声明一个静态值,但我调整了代码,原始代码依赖于argv输入,因此更难以举例说明。
答案 0 :(得分:0)
@Someprogrammerdude在评论中回答的问题:
&#34;您似乎忘记了C中的char字符串实际上称为以空字符结尾的字节字符串。空终止符很重要,不要忘记。请注意,null-terminator是字符&#39; \ 0&#39;,而不是空指针(如NULL是)。当然,这意味着两个字符的字符串需要三个字符的空格,以适应终结符。&#34;
<强>解决方案强>
char pass[5] = "";
char salt[3] = "";
而不是
char pass[4];
char salt[2];