*** %n in writable segment detected ***
Aborted
当我运行这个简单的c程序时,程序开始执行,等待stdin输入,然后执行print语句。
一切都按预期正常工作,但当我输入'%n'到斯坦丁,我收到:
{{1}}
发生了什么,为什么输入fgets()会导致这种情况?
答案 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)