【发布时间】:2011-08-16 02:53:21
【问题描述】:
我正在研究一个安全单元,并试图理解格式字符串攻击。有人可以尝试向我解释一下吗?
以下代码摘自:http://julianor.tripod.com/bc/tn-usfs.pdf:
/*
* fmtme.c
* Format a value into a fixed-size buffer
*/
#include <stdio.h>
int
main(int argc, char **argv)
{
char buf[100];
int x;
if(argc != 2)
exit(1);
x = 1;
snprintf(buf, sizeof buf, argv[1]);
buf[sizeof buf - 1] = 0;
printf("buffer (%d): %s\n", strlen(buf), buf);
printf("x is %d/%#x (@ %p)\n", x, x, &x);
return 0;
}
据我了解,%n 格式说明符用于将指定地址读回内存,然后当printf 将值从堆栈中弹出时,它应该读取我们的地址。我似乎无法解决这个问题。
文档中提供了以下示例:
perl -e 'system "./fmtme", "\x58\x74\x04\x08%d%n"'
\x58\x74\x04\x08%d%n 是从哪里来的?
【问题讨论】:
标签: c string security printf format-string