gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:19:37 25 4
gpt4 key购买 nike

我正在尝试覆盖堆栈上的一个 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
}

第一次注入(inject)有效,但第二次注入(inject)出现编译错误。

我正在使用 g++ 编译器运行 Redhat Linux。我从编译器得到的错误是:
“无法在赋值中将‘void (*)(char)’转换为‘void(char)’”

如果我将该行更改为 *(void(char)) 那么编译器会说:
“对函数类型‘void(char)’的强制转换无效”

正确的语法是什么?

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

最佳答案

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

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

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

编辑:正如@DavidGrayson 所指出的,如果我们对等式的右边进行推导,我们将得到函数的内容,而不是它的指针。所以我们必须将它转换为 POD 类型,而不是指针。

关于C++ 将函数指针插入内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28378234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com