首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >%n格式说明符在C中的用途是什么?

%n格式说明符在C中的用途是什么?
EN

Stack Overflow用户
提问于 2010-08-04 06:11:04
回答 6查看 112.1K关注 0票数 141

%n格式说明符在C中的用途是什么?谁能举个例子来解释一下?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-08-04 06:14:42

未打印任何内容。该参数必须是指向带符号整型的指针,其中存储了到目前为止写入的字符数。

代码语言:javascript
复制
#include <stdio.h>

int main()
{
  int val;

  printf("blah %n blah\n", &val);

  printf("val = %d\n", val);

  return 0;

}

上面的代码打印如下:

代码语言:javascript
复制
blah  blah
val = 5
票数 158
EN

Stack Overflow用户

发布于 2010-08-04 06:37:35

我还没有真正看到过%n说明符在现实世界中的实际用法,但我记得很久以前在老式的printf漏洞中使用过format string attack

事情是这样的

代码语言:javascript
复制
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

票数 19
EN

Stack Overflow用户

发布于 2010-08-04 20:16:05

到目前为止,所有的答案都是关于%n的,但没有人首先想要它的原因。我发现它在sprintf/snprintf中有些用处,因为以后可能需要拆分或修改结果字符串,因为存储的值是结果字符串的数组索引。但是,这个应用程序在使用sscanf时要有用得多,特别是因为scanf家族中的函数不返回已处理的字符数,而是返回字段数。

另一个真正的黑客用途是同时免费获得一个伪log10,同时打印一个数字作为另一个操作的一部分。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3401156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档