c - 这提出了分段错误(核心转储)
问题描述
所以我现在正在研究一个 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;
}
解决方案
好的,我原来的答案不是你想要的答案。既然你已经澄清了:
该函数在将指针check_password
转换为指针时做了一些“有点顽皮”的事情,但这没关系。它至少需要 20 个字符,以便可以将字符串“解释”为 5 个整数的数组。const char*
int*
调用此函数时,需要向其传递一个字符串(至少 20 个字符)。在main
您显示的示例中,此字符串是argv[1]
,它是程序名称之后的第一个参数;因此,如果您使用“checkpw ABCD1234WXYZ5678aaaa”运行程序,那么 ABC... 字符串将是传递给函数的数据。
这有帮助吗?
推荐阅读
- c - 如果 malloc 没有返回任何内容,如何停止 for 循环和编程
- coldfusion - 从 Coldfusion 9 升级到 Coldfusion 2021
- mysql - 如何*有效地*获得*标准* SQL 中每组行的评分最高的行?
- python - Jupyter Notebook:在 /home 和/或隐藏文件之外编辑文件 - 解决方法
- reactjs - React Native Custom Hook call with Parameter Invalid Hook Call
- php - 如何重构这个功能?
- python - numpy shuffle 一部分子数组
- c# - 如何自己编写LINQ操作?
- c++ - CUDA 内核的奇怪行为
- python - 可以在没有通过字段的情况下创建 ManyToMany 吗?