You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过GCC/ld选项使程序.data段具备可执行权限?

问题

需要让程序的.data段具备可执行权限,尝试过-z execstack编译选项,但该选项仅让栈(内存映射中[stack]区域)获得rwxp权限,.data段对应内存映射中0x555555558000-0x555555559000区域仍为rw-p,未达到预期效果。要求通过ld链接器修改.data段权限,且不能修改源码、不能使用mmap,此为练习任务。

内存映射信息如下:

Mapped address spaces:

          Start Addr           End Addr       Size     Offset  Perms  objfile
      0x555555554000     0x555555555000     0x1000        0x0  r--p   /home/hello/pwn_basic/Labs/Lab 3/Lab 3/ret2sc
      0x555555555000     0x555555556000     0x1000     0x1000  r-xp   /home/hello/pwn_basic/Labs/Lab 3/Lab 3/ret2sc
      0x555555556000     0x555555557000     0x1000     0x2000  r--p   /home/hello/pwn_basic/Labs/Lab 3/Lab 3/ret2sc
      0x555555557000     0x555555558000     0x1000     0x2000  r--p   /home/hello/pwn_basic/Labs/Lab 3/Lab 3/ret2sc
      0x555555558000     0x555555559000     0x1000     0x3000  rw-p   /home/hello/pwn_basic/Labs/Lab 3/Lab 3/ret2sc
      0x7ffff7d83000     0x7ffff7d86000     0x3000        0x0  rw-p   
      0x7ffff7d86000     0x7ffff7dae000    0x28000        0x0  r--p   /usr/lib/x86_64-linux-gnu/libc.so.6
      0x7ffff7dae000     0x7ffff7f43000   0x195000    0x28000  r-xp   /usr/lib/x86_64-linux-gnu/libc.so.6
      0x7ffff7f43000     0x7ffff7f9b000    0x58000   0x1bd000  r--p   /usr/lib/x86_64-linux-gnu/libc.so.6
      0x7ffff7f9b000     0x7ffff7f9c000     0x1000   0x215000  ---p   /usr/lib/x86_64-linux-gnu/libc.so.6
      0x7ffff7f9c000     0x7ffff7fa0000     0x4000   0x215000  r--p   /usr/lib/x86_64-linux-gnu/libc.so.6
      0x7ffff7fa0000     0x7ffff7fa2000     0x2000   0x219000  rw-p   /usr/lib/x86_64-linux-gnu/libc.so.6
      0x7ffff7fa2000     0x7ffff7faf000     0xd000        0x0  rw-p   
      0x7ffff7fbb000     0x7ffff7fbd000     0x2000        0x0  rw-p   
      0x7ffff7fbd000     0x7ffff7fc1000     0x4000        0x0  r--p   [vvar]
      0x7ffff7fc1000     0x7ffff7fc3000     0x2000        0x0  r-xp   [vdso]
      0x7ffff7fc3000     0x7ffff7fc5000     0x2000        0x0  r--p   /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
      0x7ffff7fc5000     0x7ffff7fef000    0x2a000     0x2000  r-xp   /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
      0x7ffff7fef000     0x7ffff7ffa000     0xb000    0x2c000  r--p   /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
      0x7ffff7ffb000     0x7ffff7ffd000     0x2000    0x37000  r--p   /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
      0x7ffff7ffd000     0x7ffff7fff000     0x2000    0x39000  rw-p   /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
      0x7ffffffdd000     0x7ffffffff000    0x22000        0x0  rwxp   [stack]

解决方法

方法一:自定义链接脚本修改

  1. 导出系统默认的链接脚本:
    ld --verbose > custom.ld
    
  2. 编辑custom.ld,找到.data段的定义块,修改其属性以添加执行权限。将原.data段定义修改为:
    .data           : ATTRIBUTES(0x7)
    {
      *(.data .data.* .gnu.linkonce.d.*)
      SORT(CONSTRUCTORS)
    }
    
    其中0x7是ELF段权限标志的组合,对应读、写、执行权限(PF_R=0x4,PF_W=0x2,PF_X=0x1,三者相加为0x7)。
  3. 使用修改后的链接脚本重新编译:
    gcc -o ret2sc ret2sc.c -T custom.ld
    

方法二:直接通过ld命令行选项设置

无需修改链接脚本,编译时直接传递ld选项指定.data段的权限属性:

gcc -o ret2sc ret2sc.c -Wl,--section-flags=.data=alloc,load,write,execute

该选项明确告诉ld将.data段标记为可分配、可加载、可写且可执行。

验证:重新编译后运行程序,查看内存映射即可看到.data段对应区域的权限变为rwxp。


内容的提问来源于stack exchange,提问作者kang kang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 13:00:56