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