我使用 gcc 编译了一个 C 代码,当我使用 readelf 检查 ELF 的部分时,我可以看到 .data 部分的标志设置为 WA(可写和可分配)。
是否可以修改这些标志?我可以使这个部分可执行吗?
我正在使用 gdb 来调试这个二进制文件,并且我想在某个点将 .data 部分的标志设置为 Executable。那么,这可以使用 gdb 或 gcc 来完成吗?
是否可以修改这些标志?我可以使这个部分可执行吗?
是的。如果您想一次性执行此操作,最简单的方法可能是将源代码编译为程序集,并在此处修改部分属性,然后将程序集编译为目标文件并照常链接。
我正在使用 gdb 来调试这个二进制文件,并且我想在某个点将 .data 部分的标志设置为 Executable。
您也可以mprotect(addr, len, PROT_READ|PROT_WRITE|PROT_EXEC)
从 GDB 内部调用。
注意:在.data
链接二进制文件后修改部分中的标志将没有任何效果:内核不查看部分,只查看PT_LOAD
段。
如何在汇编代码中将数据部分标记为可执行?我想,是这样的:.section .data,"awx",@progbits。
是的,这看起来是正确的。它没有工作吗?
未找到 mprotect()
你的可执行文件是静态链接的吗?如果没有,mprotect
应该找到(在 中libc.so
),并且您可能有 GDB 错误。它可能有助于推动 GDB 找到mprotect
您是否print &mprotect
首先。
另请注意:mprotect(0x0804a020, 80, PROT_READ, PROT_WRITE, PROT_EXEC)
与我建议的非常不同(mprotect
需要 3 个参数,而不是 5 个)。您还需要man mprotect
仔细阅读——它要求起始地址是页面对齐的。