%n
格式说明符在C中的用途是什么?谁能举个例子来解释一下?
发布于 2010-08-04 06:14:42
未打印任何内容。该参数必须是指向带符号整型的指针,其中存储了到目前为止写入的字符数。
#include <stdio.h>
int main()
{
int val;
printf("blah %n blah\n", &val);
printf("val = %d\n", val);
return 0;
}
上面的代码打印如下:
blah blah
val = 5
发布于 2010-08-04 06:37:35
我还没有真正看到过%n
说明符在现实世界中的实际用法,但我记得很久以前在老式的printf漏洞中使用过format string attack。
事情是这样的
void authorizeUser( char * username, char * password){
...code here setting authorized to false...
printf(username);
if ( authorized ) {
giveControl(username);
}
}
其中恶意用户可以利用username参数作为格式字符串传递到printf中,并使用%d
、%c
或w/e的组合来遍历调用堆栈,然后将授权的变量修改为真值。
是的,这是一种深奥的用法,但在编写守护进程以避免安全漏洞时,知道这一点总是有用的?:D
发布于 2010-08-04 20:16:05
到目前为止,所有的答案都是关于%n
的,但没有人首先想要它的原因。我发现它在sprintf
/snprintf
中有些用处,因为以后可能需要拆分或修改结果字符串,因为存储的值是结果字符串的数组索引。但是,这个应用程序在使用sscanf
时要有用得多,特别是因为scanf
家族中的函数不返回已处理的字符数,而是返回字段数。
另一个真正的黑客用途是同时免费获得一个伪log10,同时打印一个数字作为另一个操作的一部分。
https://stackoverflow.com/questions/3401156
复制相似问题