c中的printf和%s

时间:2016-02-14 01:59:11

标签: c printf buffer-overflow

据我所知,此代码段应该存在缓冲区溢出漏洞问题:

dd

但是,我并不完全明白为什么它被认为是有风险的。有人能够对此有所了解吗?

2 个答案:

答案 0 :(得分:3)

以下代码将my_file_name的内容输出到标准输出:

printf("File %s", my_file_name);

如果从恶意来源收到my_file_name并且程序输出到终端,恶意来源可能会在my_file_name中放置转义序列,告诉终端执行非常重要的任务例如通过标准输入发回终端内容。很难但可以想象,攻击者可以从这种攻击中获取有用的信息,甚至可以通过执行命令来破坏数据,就像用户输入的那样。

当然,第二个调用会调用未定义的行为,因为您没有将有效的字符串指针作为第二个参数传递给printf

上述情况可能不是您所指的缓冲区溢出漏洞。它本身的printf代码中没有这样的漏洞,但是代码中的其他地方存在缓冲区溢出漏洞,实际的格式字符串可以通过此溢出修补,攻击者可以利用{{1 }}的功能,特别是printf格式,可以将任何值戳到程序存储器中的几乎任何位置。这是删除Microsoft安全文件中公开的%n%n的基本原理。

答案 1 :(得分:2)

第一个电话很好。 (当您使用用户提供的格式字符串时存在问题,如printf(s)中,其中s受用户的影响。这里使用硬编码格式字符串"File %s",它不容易受到攻击。字符串my_file_name的内容将被视为常规C字符串,只是被复制到标准输出。当然它必须为空终止,如果输出被重定向到其他东西,那么可能会有副作用,但这不是printf问题。)

第二个调用只是未定义的行为,因为格式字符串(0)之后的参数数量与格式字符串要求的数量(1)不匹配。