2013-08-21 49 views
1

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

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

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

回答

3

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

是的。如果你想这样做一次性,最简单的方法可能是将源代码编译为程序集,并修改那里的段属性,然后像往常一样将程序集编译成目标文件和链接。

我正在使用gdb来调试这个二进制文件,并且我想将.data节的标志设置为可执行文件在某个点。

你也可以在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 - 它需要起始地址为页面对齐。

+0

谢谢。你能告诉一个关于如何在汇编代码中将数据段标记为可执行文件的例子吗?我想,像这样:.section .data,“awx”,@ progbits。此外,我尝试使用gdb内的mprotect调用(同时调试二进制main()子例程)如下所示:mprotect(0x0804a020,80,PROT_READ,PROT_WRITE,PROT_EXEC),它说,找不到mprotect()。 –

+0

@NeonFlash我已经更新了答案。 –