格式化字符串漏洞,从堆栈打印变量

时间:2011-10-05 23:47:57

标签: c string stack format

我正在学习格式字符串漏洞,我已经编写了一个测试程序来试用它们。这是我的测试程序:

#include <stdio.h>
int main(int argc, char *argv[])
{
    char test[] = "Whatever \n";
printf(argv[1]);
return 0;
}

如果我使用%p作为argv[1],它当然会从堆栈中打印出一个地址。如果我输入%sargv[1],打印出来:

__libc_start_main

我的节目或参数是否有问题?如何从堆栈中打印test[]数组?这只是一个例子,我想知道如何从堆栈中打印出一般的任何变量。我刚刚使用这个程序,所以我有一个简单的例子。

2 个答案:

答案 0 :(得分:1)

test []不会出现在printf中的堆栈顶部。它将位于argv [1]和返回地址之下,因此您编写的代码将永远不会起作用。如果有办法让它工作,你将不得不为argv [1]提供多个格式说明符。您将需要熟悉C调用约定,堆栈以及解决此问题的一些程序集。

答案 1 :(得分:0)

有些编译器可能会优化test []的定义,而这些定义并不会出现在函数的任何其他地方。尝试在main中的其他地方使用数组。