我有以下代码,并试图了解vsnprintf为什么会导致格式字符串漏洞。
如果我按以下方式执行程序“ ./test%llx”,是否是因为“%llx”已传递到va_list中,然后由vsprintf解释并因此导致格式字符串vuln引起的漏洞?
#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
-function-family写入内存(到目前为止已写入的字节数)。
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/