我想我了解格式字符串漏洞的工作原理,但是到目前为止,我所看到的只能用于增加整数的值。

格式字符串漏洞也可以用于编写其他内容顺便说一句,顺便说一句,除了C和C ++之外,是否还有其他语言有创建此类漏洞的风险?如果只有二进制文件,如何发现格式字符串漏洞?

#1 楼

有很多问题,下面是一些答案:

我们如何在内存中写一些带有格式字符串漏洞的东西? printf格式字符串规范中使用的功能。首先,%n是一种格式说明符,具有以下作用(根据手册页):


或变体)指针参数。没有参数被转换。


现在,第二个格式字符串功能将允许我们从格式字符串中选择特定的参数。主要选择运算符是%n,以下代码表示我们选择了第二个参数(此处的结果将显示int *):

printf("%2$x", 1, 2, 3)


一般情况下,我们可以执行$以选择当前2函数的任意参数(格式字符串参数不计算在内)。

如果我们可以将字符串printf("%<some number>$x")传递给程序并使它显示为格式字符串,那么我们可以将值printf写入地址AAAA%10$n中。 br />
我真的建议您阅读Scut(2001)的“利用格式字符串漏洞”,以全面了解这些操作。 C ++容易受到这些错误的影响吗?可以传递给函数。这本身就是一类安全问题。因此,您可能会找到其他一些语言来利用类似问题的方法。但是,您可能找不到与其他语言中的格式字符串功能完全不同的功能。

我确实考虑过Perl,Python等语言,它们都提供对格式字符串功能的类似访问。 >
首先,您必须找到4系列过程的调用。然后,我要说模糊测试(fuzzing)应该是找到漏洞的好方法。尤其是如果您可以伪造一些带有种子的条目,例如0x41414141。符合printf系列的程序。

评论


哦,酷。但是我将如何写“ 0”呢?据我了解,您必须至少打印一些内容,因此%n的计数至少为> 0?

– newbie2463465
2014年5月30日下午16:14

在“利用格式字符串漏洞”(PDF)的第15页上讨论了写入任意数据的方法。它有点长,您最好参考本文档以进一步使用此类错误。但是请注意,它们现在是一些对策,例如FORTIFY_SOURCE GCC选项。有关更多信息,请参考:格式字符串悼词(Phrack#67,2010年)。

–恐怖
2014年5月30日16:25