如何通过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]
解决方法
方法一:自定义链接脚本修改
- 导出系统默认的链接脚本:
ld --verbose > custom.ld - 编辑
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)。 - 使用修改后的链接脚本重新编译:
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
相关产品推荐
相关产品推荐

