c - vsnprintf 为什么会导致格式字符串漏洞

标签 c security string-formatting

我有以下代码,并试图理解为什么 vsnprintf 会导致格式字符串漏洞。

如果我执行如下程序“./test %llx”,这个漏洞是否是因为“%llx”被传入va_list,然后被vsprintf解释,从而导致格式字符串出现漏洞?

#include <stdio.h>
#include <stdarg.h>

#define MAX_STRING_LENGTH 512

void cmd(char *dir)
{
    char errbuf[MAX_STRING_LENGTH+1];
    snprintf(errbuf, 512, "Error '%s'.\n", dir);
    puts("cmd: ");
    puts(errbuf);
    control_printf(2, errbuf);
}

void control_printf(char success, char *format, ...)
{
    char buffer[MAX_STRING_LENGTH];
    va_list val;
    va_start(val, format);
    puts("control_printf before vsnprintf: ");
    puts(format);
    vsnprintf(buffer, sizeof(buffer), format, val);
    va_end(val);
    puts("control_printf after vsnprintf: ");
    puts(buffer);
    fprintf(stderr, "%s\r\n", buffer);
}

int main(int argv, char **argc)
{
    cmd(argc[1]);
    return 0;
}

我该如何解决这个问题?

最佳答案

我真的不明白你想在这里完成什么,但该漏洞来自于让用户黑客提供格式字符串。然后,他可以提供%n,这会导致printf函数族写入内存(到目前为止写入的字节数)。

int answer = 42;
printf("Hello %nworld\n", &answer);
// "Hello " is 6 bytes long
printf(
    "The answer to the ultimate question of life, "
    "the universe and everything is: %i\n"
    , answer
);

将打印 6 作为答案,而不是 42。

关于c - vsnprintf 为什么会导致格式字符串漏洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35858899/

相关文章:

python - 如何将 f-string 与变量一起使用,而不是与字符串文字一起使用?

c - 如何使用 : "\\" or "\"? 分割字符串

c - struct sockaddr.sa_data 似乎太小

python - 我需要在 Python 中安全地存储用户名和密码,我有哪些选择?

c# - 更改绑定(bind)中的默认千位和小数点分隔符

python - 嵌套的 f 字符串

c - GCC:将结构归零

c# - 翻译 C unsigned long long and bitwise in for loop to c#

python - 有人试图侵入我的 Django 应用程序吗?

git - 如何修复 .git 暴露的 firebase 漏洞