Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 防止格式字符串漏洞_String_Format - Fatal编程技术网

String 防止格式字符串漏洞

String 防止格式字符串漏洞,string,format,String,Format,Windows系统中的“格式字符串漏洞”到底是什么,它是如何工作的,我如何防范它?在这个伪代码中,用户输入一些要打印的字符,如“hello” 这正是我们想要的。但是由于write可以格式化字符串,例如 int i=getUnits(); write("%02d units",i); 产出:“03个单位”。如果用户首先写入了“%02d”。。。由于堆栈上没有参数,因此将获取其他内容。这是什么,这是否是一个问题取决于程序 一个简单的解决方法是告诉程序输出字符串: write("%s",s); 或者

Windows系统中的“格式字符串漏洞”到底是什么,它是如何工作的,我如何防范它?

在这个伪代码中,用户输入一些要打印的字符,如“hello”

这正是我们想要的。但是由于write可以格式化字符串,例如

int i=getUnits();
write("%02d units",i);
产出:“03个单位”。如果用户首先写入了“%02d”。。。由于堆栈上没有参数,因此将获取其他内容。这是什么,这是否是一个问题取决于程序

一个简单的解决方法是告诉程序输出字符串:

write("%s",s);
或者使用另一种不尝试格式化字符串的方法:

output(s);

向wikipedia提供更多信息。

格式字符串攻击最简单的方式是:

char buffer[128];
gets(buffer);
printf(buffer);
这里也有一个缓冲区溢出漏洞,但关键是:您正在将不受信任的数据(从用户)传递给使用该参数作为格式字符串的
printf
(或其同类)

也就是说:如果用户在“%s”中键入,您就有一个信息泄露漏洞,因为
printf
会将用户输入视为格式字符串,并尝试将堆栈上的下一个内容打印为字符串。就好像你的代码说的是
printf(“%s”)。由于您没有将任何其他参数传递给
printf
,因此它将显示任意内容

如果用户键入“%n”,则可能会受到权限提升攻击(至少是拒绝服务攻击),因为%n格式字符串会导致
printf
将迄今为止打印的字符数写入堆栈上的下一个位置。因为您没有给它一个放置此值的位置,所以它将写入任意位置

这一切都很糟糕,这也是为什么在使用
printf
和cossins时要格外小心的原因之一

你应该做的是:

printf("%s", buffer);
<>这意味着用户的输入永远不会被当作一个格式字符串,所以你可以从那个特定的攻击向量中安全。
在VisualC++中,您可以使用<代码> .yFrimaTyScript < /COD>注释来告诉它验证参数<代码> Prtff。默认情况下不允许使用代码>%n
。在GCC中,您可以使用
\uuuuuu attribute\uuuuuu(\uuuu printf\uuuuuuu)
进行相同的操作。

知道如何攻击有助于知道如何防御/避免漏洞。这就是公开披露此类漏洞/漏洞的想法。很公平,也许我误解了问题的基调,多亏ctacke对其进行了编辑。我发布了一个答案,假设它值得怀疑。我编辑了这个问题,所以它现在真的在问同样的信息,但用的语言更合适,也更友好。我不确定原作者的意图,但如果它不是我更改的,它注定会被删除。
printf("%s", buffer);