为什么这个用户输入到fgets()会导致程序中止?

时间:2018-04-08 19:41:41

标签: c crash fgets

*** %n in writable segment detected ***
Aborted

当我运行这个简单的c程序时,程序开始执行,等待stdin输入,然后执行print语句。

一切都按预期正常工作,但当我输入'%n'到斯坦丁,我收到:

{{1}}

发生了什么,为什么输入fgets()会导致这种情况?

1 个答案:

答案 0 :(得分:0)

来自https://linux.die.net/man/3/snprintf

  

printf(foo)等代码;经常表示一个错误,因为foo可能包含%字符。如果foo来自不受信任的用户输入,则它可能包含%n,导致printf()调用写入内存并创建安全漏洞。

snprintf的第三个参数是格式字符串(与上面的情况相同)。

让用户输入格式说明符(特别是%n,请参阅What is the use of the %n format specifier in C?)将程序打开到安全漏洞。这里程序读取内存中的一些垃圾值(因为没有指定进一步的参数)并写入它,这就是%n特别危险的原因(这里似乎是在之前拦截了 通过C库写入内存,很棒的功能)

正如Craig评论的那样,请始终使用您的格式字符串来处理用户输入:

snprintf(buf,sizeof buf,"%s",s)