1

我使用 gcc 编译了一个 C 代码,当我使用 readelf 检查 ELF 的部分时,我可以看到 .data 部分的标志设置为 WA(可写和可分配)。

是否可以修改这些标志?我可以使这个部分可执行吗?

我正在使用 gdb 来调试这个二进制文件,并且我想在某个点将 .data 部分的标志设置为 Executable。那么,这可以使用 gdb 或 gcc 来完成吗?

4

1 回答 1

3

是否可以修改这些标志?我可以使这个部分可执行吗?

是的。如果您想一次性执行此操作,最简单的方法可能是将源代码编译为程序集,并在此处修改部分属性,然后将程序集编译为目标文件并照常链接。

我正在使用 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仔细阅读——它要求起始地址是页面对齐的。

于 2013-08-21T06:56:20.640 回答