我正在学习格式字符串漏洞,我已经编写了一个测试程序来试用它们。这是我的测试程序:
#include <stdio.h>
int main(int argc, char *argv[])
{
char test[] = "Whatever \n";
printf(argv[1]);
return 0;
}
如果我使用%p
作为argv[1]
,它当然会从堆栈中打印出一个地址。如果我输入%s
如argv[1]
,打印出来:
__libc_start_main
我的节目或参数是否有问题?如何从堆栈中打印test[]
数组?这只是一个例子,我想知道如何从堆栈中打印出一般的任何变量。我刚刚使用这个程序,所以我有一个简单的例子。
答案 0 :(得分:1)
test []不会出现在printf中的堆栈顶部。它将位于argv [1]和返回地址之下,因此您编写的代码将永远不会起作用。如果有办法让它工作,你将不得不为argv [1]提供多个格式说明符。您将需要熟悉C调用约定,堆栈以及解决此问题的一些程序集。
答案 1 :(得分:0)
有些编译器可能会优化test []的定义,而这些定义并不会出现在函数的任何其他地方。尝试在main中的其他地方使用数组。