Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;将函数指针插入内存_C++_Security_Function Pointers - Fatal编程技术网

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

C++ C++;将函数指针插入内存,c++,security,function-pointers,C++,Security,Function Pointers,我试图覆盖堆栈上的字符和函数指针。根据我在这个问题()上的发现,我能够找出如何覆盖字符。我现在的问题是,我得到一个编译错误,说我投错了 void foo(char letter); void bar(char letter); void function1() { void (*pointer)(char); pointer = foo; letter = 'B'; function2(); (*pointer)(letter); } void function2() {

我试图覆盖堆栈上的字符和函数指针。根据我在这个问题()上的发现,我能够找出如何覆盖字符。我现在的问题是,我得到一个编译错误,说我投错了

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)”的强制转换无效

这个的正确语法是什么


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

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

*(long *)(&number + 13) = (long)&pass;
而且不会出现编译器错误。至于调用这个未定义的行为时会发生什么,您只需要看看


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

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