我正在使用 ./ crack 50yoN9fp966dU执行此程序 50yoN9fp966dU 是crimson加密的。这是在单词列表上。我的计划如下:
#define _XOPEN_SOURCE
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
if(argc > 2)
{
printf("Invalid Argument \n");
return 1;
}
else
{
FILE *fp1;
fp1 = fopen("/usr/share/dict/words", "r");
char line[9];
while (fgets(line, 9, fp1) != NULL)
{
char *EncryptLine1;
char *EncryptLine2;
printf("%s", line);
EncryptLine1 = crypt(line, "50");
if(argv[1] == EncryptLine1)
{
printf("%s \n", line);
}
EncryptLine2 = crypt(line, "HA");
if(argv[1] == EncryptLine2)
{
printf("%s \n", EncryptLine2);
}
}
}
}
如果我添加printf("%s", EncryptLine1)
,我会看到argv[1]
,即 50yoN9fp966dU ,但循环继续并且不会打印答案。
答案 0 :(得分:2)
您正在进行指针比较,而不是内容(指向数据)比较。
改变这个:
if (argv[1] == EncryptLine1)
对此:
if (strcmp(argv[1],EncryptLine1) == 0)
而且:
if (argv[1] == EncryptLine2)
对此:
if (strcmp(argv[1],EncryptLine2) == 0)
答案 1 :(得分:1)
argv[1]
,EncryptLine1
和EncryptLine2
都是char*
。两个operator==
上的char*
只是检查它们是否指向相同的内存位置。你想要的是比较它们代表的字符串的内容。所以,if
应该是这样的:
if(!strcmp(argv[1], EncryptLine1))
答案 2 :(得分:1)
您的代码中存在一些问题:
argc
永远不会小于2.在第一个条件下检查不等于2而不是更大的两个。 Strings cannot be compared with ==
, use strcmp
.:
if( ! strcmp(argv[1], EncryptLine1))
如果要在那里结束循环,则需要添加break
以突破循环或添加return
以在打印成功后将函数保留在条件块中。
if( ! strcmp(argv[1], EncryptLine1)) {
printf("%s \n", line);
break;
}
EncryptLine1
(并不是说你需要任何暂时性的)?