C++ 将函数指针插入内存

C++ insert function pointer into memory

我正在尝试覆盖堆栈上的 char 和函数指针。根据我在这个问题 (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
}

第一次注入有效,但第二次注入出现编译错误。

我 运行 Redhat Linux 使用 g++ 编译器。我从编译器得到的错误是:
"cannot convert ‘void (*)(char)’ to ‘void(char)’ in assignment"

如果我将该行更改为 *(void(char)) 那么编译器会说:
"invalid cast to function type ‘void(char)’"

正确的语法是什么?

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

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

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

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

编辑:正如@DavidGrayson 所指出的,如果我们对等式的右边进行推导,我们将得到函数的内容,而不是它的指针。所以我们必须将它转换为 POD 类型,而不是指针。