gpt4 book ai didi

c - 写入函数指针

转载 作者:太空宇宙 更新时间:2023-11-04 00:07:09 24 4
gpt4 key购买 nike

为什么以下 2 个(简化的)示例会出现段错误(在 Win7 下使用 GCC 编译)?

案例 1 - 写入函数指针

void f() {return;}
int main()
{
memcpy(&f, "", 1);
return 0;
}

案例 2 - 调用数据指针

char f[] ={0xC3};
typedef void(*p)();
int main()
{
((p)f)();
return 0;
}

我知道是因为我在写内存的RO段,跳转到不可执行的内存段。 (或类似的东西)。我的问题是宏观意义上的“为什么”:
什么系统完全执行此操作?它是在操作系统级别吗?在硬件层面?在硬件级别,但在将二进制文件加载到内存时需要由操作系统设置?这是什么子系统?等等……

也许“如何”是比“为什么”更好的问题。

最佳答案

对于 Windows,这是通过页面保护在操作系统级别强制执行的。每个页面都分配了一组保护标志,指定其特性(可读、可写、可执行、保护页面等)。可以使用 VirtualProtect 更改页面保护之后您将能够写入代码页。

在代码不可执行的情况下,硬件可能会支持 NX 标志,这实际上是 VirtualProtect 正在切换的内容。

关于c - 写入函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18849458/

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