【发布时间】:2017-08-25 23:35:44
【问题描述】:
假设我有以下程序:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
char buf [100];
snprintf ( buf, sizeof buf, argv [1] ) ;
buf [ sizeof buf -1 ] = 0;
printf ( "%s \n" , buf ) ;
return 0 ;
}
如果我编译并运行它:
gcc test.c -o test
./test %p%p%p
(nil)0x4006d00x7f67e05b7ab0
我可以看到堆栈值,这意味着它受到格式字符串漏洞的影响。
现在,让我们稍微修改一下上面的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
char buf [100];
printf ( "%s \n" , argv[1] ) ;
return 0 ;
}
如果我重新编译并重新运行它,漏洞就消失了:
gcc test.c -o test
./test %p%p%p
%p%p%p
为什么会发生这种情况,与第一个示例相比有何变化?
另外,在第一个例子中,printf 中的 %s 不应该将 buf 视为字符串吗?为什么这样的代码仍然受到格式字符串漏洞的影响?
【问题讨论】:
-
%p%p%p很蹩脚,试试%n%n%n%n -
那些多余的空间看起来很糟糕。他们使阅读正在发生的事情变得更难
-
好吧,你完全删除了易受攻击的部分,一方面。
标签: c string security exploit format-string