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