【问题标题】:Format string exploit, printing variables from stack格式化字符串漏洞利用,从堆栈打印变量
【发布时间】:2011-12-01 21:55:37
【问题描述】:

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

#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[] 数组?这只是一个例子,我想知道如何从堆栈中打印出任何变量。我只是在使用这个程序,所以我有一个简单的例子。

【问题讨论】:

  • 您使用的是什么操作系统和编译器?您需要为此添加标签。这是作业吗?如果是这样,请添加该标签。
  • 我相信您知道您的代码行为是未定义的(即未由 C 标准定义)。

标签: c string stack format


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 好的,这段代码呢。我遵循了使用此代码的视频教程,它在视频中完美运行,但同样的问题发生在我身上:#include int main(int argc, char *argv[]) { char *便便 = “测试”; printf(argv[1]);返回0; }
    猜你喜欢
    • 2013-10-10
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 2012-05-31
    相关资源
    最近更新 更多