【问题标题】:ELF modify section flagsELF 修改节标志
【发布时间】:2013-08-21 05:51:27
【问题描述】:

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

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

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

【问题讨论】:

    标签: gcc gdb readelf


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。您能否举例说明如何在汇编代码中将数据部分标记为可执行文件?我想,是这样的:.section .data,"awx",@progbits。另外,我尝试在 gdb 中使用 mprotect 调用(同时以二进制形式调试 main() 子例程),如下所示:mprotect(0x0804a020, 80, PROT_READ, PROT_WRITE, PROT_EXEC) 它说找不到 mprotect()。
    猜你喜欢
    • 2013-03-29
    • 2010-10-22
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多