【问题标题】:C++ insert function pointer into memoryC ++将函数指针插入内存
【发布时间】:2015-02-07 03:30:10
【问题描述】:

我正在尝试覆盖堆栈上的字符和函数指针。根据我在这个问题 (How can I store a value at a specific location in the memory?) 上的发现,我能够弄清楚如何覆盖该字符。我现在的问题是我收到一个编译错误,说我投错了。

void foo(char letter);
void bar(char letter);

void function1()
{
  void (*pointer)(char);
  pointer = foo;
  letter = 'B';
  function2();
  (*pointer)(letter);
}

void function2()
{
  int number; // Used in omitted code

  *(char *)(&number + 75) = 'A';
  *(void (*)(char)) (&number + 42) = &bar; // This is the line with the error
}

第一次注入有效,但第二次给我一个编译错误。

我正在使用 g++ 编译器运行 Redhat Linux。我从编译器得到的错误是:
“不能在赋值中将‘void (*)(char)’转换为‘void(char)’”

如果我将该行更改为 *(void(char)) 那么编译器会说:
“无效转换为函数类型‘void(char)’”

什么是正确的语法?

(这是学校安全作业的修改代码,我不是在编写恶意软件)

【问题讨论】:

  • 如果要将pass的地址写入内存中的某个位置,请不要尝试将内存地址强制转换为函数指针。将函数指针转换为内存地址。
  • 最好发布编译器的确切输出并清楚地指出错误发生在哪一行。此外,由于您正在尝试做一些棘手的事情并且可能会遇到编译器优化问题,因此您应该准确说明您正在使用什么编译器、您用于编译的命令以及您正在运行的操作系统。
  • 所以你正在尝试编写恶意软件,并来寻求帮助?
  • @RedAlert 我该怎么做?
  • @self,你在拖钓吗?这是安全课程中非常常见的计算机科学主题。

标签: c++ security function-pointers


【解决方案1】:

您的目标是将pass 的地址写入内存,那么为什么要将(&number + 13) 转换为函数指针呢?做你以前做过的事:

*(long *)(&number + 13) = (long)&pass;

而且您不会收到编译器错误。至于当这个未定义的行为被调用时会发生什么,你只需要看看。

编辑:正如@DavidGrayson 指出的那样,如果我们遵循等式的右侧,我们将得到函数的内容,而不是它的指针。所以我们必须将其转换为 POD 类型,而不是指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多