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

时间:2015-02-07 03:30:10

标签: c++ security function-pointers

我试图覆盖堆栈上的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
}

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

我正在使用g ++编译器运行Redhat Linux。我从编译器得到的错误是:
 “无法在赋值”

中将'void(*)(char)'转换为'void(char)'

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

这个的正确语法是什么?

(这是来自学校安全任务的修改代码,我不是在编写恶意软件)

1 个答案:

答案 0 :(得分:1)

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

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

您不会遇到编译器错误。至于调用此未定义行为时会发生什么,您只需要看到。

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