3 回答
TA贡献1848条经验 获得超2个赞
这些答案大多数都解释了%n 做什么(即不打印任何内容并将到目前为止已打印的字符数写入int变量),但是到目前为止,还没有人真正给出其用途的示例。这是一个:
int n;
printf("%s: %nFoo\n", "hello", &n);
printf("%*sBar\n", n, "");
将打印:
hello: Foo
Bar
Foo和Bar对齐。(在不使用%n此特定示例的情况下,这样做很简单,通常总会打断第一个printf调用:
int n = printf("%s: ", "hello");
printf("Foo\n");
printf("%*sBar\n", n, "");
稍微增加一点便利是否值得使用深奥的东西%n(可能会引入错误)值得商debate。
TA贡献1942条经验 获得超3个赞
什么都没打印。该参数必须是一个指向带符号的int的指针,该整数存储了到目前为止写入的字符数。
#include <stdio.h>
int main()
{
int val;
printf("blah %n blah\n", &val);
printf("val = %d\n", val);
return 0;
}
先前的代码显示:
blah blah
val = 5
TA贡献1809条经验 获得超8个赞
我还没有真正看到过该%n说明符在现实世界中的许多实际用途,但是我记得它在很久以前就曾用于格式字符串攻击的老式printf漏洞中。
这样的事情
void authorizeUser( char * username, char * password){
...code here setting authorized to false...
printf(username);
if ( authorized ) {
giveControl(username);
}
}
其中,恶意用户可能会获得通过到的printf作为格式字符串获取用户名参数的优势和使用的组合%d,%c或W / E去通过调用栈,然后修改授权的真实值的变量。
是的,这是一种深奥的用法,但是在编写守护程序以避免安全漏洞时总是有用的吗?:D
- 3 回答
- 0 关注
- 3639 浏览
添加回答
举报