【发布时间】: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