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 类型,而不是指针。
我正在尝试覆盖堆栈上的 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 类型,而不是指针。