C语言 是否会发生堆栈粉碎,或者这是一个格式字符串漏洞?

k5ifujac  于 2022-12-11  发布在  其他
关注(0)|答案(1)|浏览(91)

我正在分析一个代码,试图确定这个代码产生了什么漏洞。到目前为止,我认为这是堆栈破坏,因为当第一次输入密码时,如果少于12个字符,它会说它是错误的。当尝试另一个密码时,即使它不是正确的。它说它是正确的。这可能是由sizeof(char)函数引起的,对吗?下面是我正在分析的代码:

#include <stdio.h>

void detonate_bomb () {
    puts("Approved: bomb detonated!");
    //insert code to detonate the detonate_bomb
    exit(1);
}

#define MAX_INPUT 12
int main() {
    char *key = malloc(MAX_INPUT *sizeof(char));
    strcpy(key, "TiTan15m1D\n");
    while (!feof(stdin)) {
        char *input_pwd = malloc(MAX_INPUT *sizeof(char));
        fgets(input_pwd, MAX_INPUT, stdin);
        if (strcmp(input_pwd, key) == 0)
            detonate_bomb();
        free(input_pwd);
        free(key);
        puts("Wrong password, try again!");
    }
}
zbdgwd5y

zbdgwd5y1#

由于不存在格式字符串,因此不存在格式字符串漏洞。
由于没有在堆栈上分配缓冲区数据,因此不会发生堆栈粉碎。
至于代码的问题:

  • 如果malloc成功,则不进行检查。
  • 并非所有必要的头文件都包含在内,从而妨碍了使用标准C编译器进行成功编译。
  • feof使用不当-代码应改为检查fgets的结果。不检查fgets是否成功也是一个漏洞。
  • 程序freewhile循环中间的所有缓冲区都有明显的错误。malloc和free调用都应该移出循环。也就是说,这个程序在没有恶意用户帮助的情况下会自己崩溃。

相关问题