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