我注意到,当printf/sprintf函数的格式字符串中的转换说明符与相应参数的类型或计数不匹配时,大量C编译器会发出警告.
在我看来,这似乎是一个概念上的突破,因为根据语言规范,C没有内置函数.
所有编译器都应该知道printf/sprintf是他们的原型而不是他们的语义.我知道printf/sprintf是标准的C函数,但是它们存在于一个单独的库libc中,你必须包含stdio.h才能导入它们的原型.
许多编译器所做的是分析格式字符串,该格式字符串也可以在运行时提供.
以上是否有意义?
我对printf通过 NDK 应用程序演示漏洞感兴趣。需要明确的是,我知道要登录控制台,我们可以使用__android_log_print(ANDROID_LOG_DEBUG, "LOG_TAG", "Print : %d %s",someVal, someStr);. 我试过了,我知道它有效。但我明确地想演示 的漏洞printf(),特别是使用说明%n符写入指向的位置。
有没有办法使printf()工作达到这种效果,或者是否可以通过 实现__android_log_print()?我用android/log.h标题尝试了它,但它没有用。
我可以通过运行一些类似printf(%s%s%s%s%s%s%s%s%s%s). 但同样,我不能操纵指针。
出于一般知识的目的,为什么它printf()首先不起作用以及如何__android_log_print()防止这些漏洞利用?