我试图覆盖堆栈上的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)'”
这个的正确语法是什么?
(这是来自学校安全任务的修改代码,我不是在编写恶意软件)
答案 0 :(得分:1)
您的目标是将pass
的地址写入内存,那么为什么要将(&number + 13)
转换为函数指针?做你以前做的事情:
*(long *)(&number + 13) = (long)&pass;
您不会遇到编译器错误。至于调用此未定义行为时会发生什么,您只需要看到。
编辑:正如@DavidGrayson指出的那样,如果我们尊重等式的右边,我们就得到函数的内容,而不是它的指针。所以我们必须将其转换为POD类型,而不是指针。