为啥.bss段没有可执行属性?

Posted

技术标签:

【中文标题】为啥.bss段没有可执行属性?【英文标题】:Why does the .bss segment have no executable attribute?为什么.bss段没有可执行属性? 【发布时间】:2022-01-20 21:23:22 【问题描述】:

我有一个来自 pwnable.tw 的名为 orw 的 ELF 32 位可执行文件:https://pwnable.tw/challenge/。在我的 Ubuntu18.04 中,可以执行 .bss 段:

但是在我的 Ubuntu20 和 IDA Pro 中,.bss 段没有可执行属性,为什么?

【问题讨论】:

即使有变化,为什么 bss 段应该有 exe 权限。可以执行数据吗? 您能否编辑您的问题以显示两个系统各自的内核版本? 这能回答你的问题吗? Linux default behavior of executable .data section changed between 5.4 and 5.9? @Klaus 这只是一个 CTF 程序。 @Mark Plotnick Ubuntu20 的内核版本是 Linux 5.11.0-43-generic。而Ubuntu18的内核版本是Linux 5.4.0-84-generic。 【参考方案1】:

为什么.bss段没有可执行属性?

在一个正常可执行文件.bss应该有执行权限,所以奇怪的是Ubuntu 18.04的结果,而不是相反。

以下都是相关的:

readelf -Wl orw 的输出 内核版本 cat /proc/cpuinfo 的输出 模拟器详细信息(如果您使用某种模拟器)。

我怀疑您正在使用模拟器,它被设置为模拟NX-bit 之前的处理器(W暗示 X 位以及)。

或者,可执行文件缺少PT_GNU_STACK 段,在这种情况下this answer 很可能是正确的——此类二进制文件的内核默认值已更改。

【讨论】:

【参考方案2】:

.bss 是未初始化全局变量的段,所以它通常不是可执行的(它不需要)。如果您希望它可执行(因为您正在编译您希望能够测试的机器代码),您可能需要选择一个特殊的段或创建两个重叠的段(一个可执行文件和其他读/写)以允许写入代码,同时您也可以执行它。这可以在您用于链接可执行文件的标准脚本中指定(当然,使用不同的名称),或者如果尚未为您完成,您可以指定允许创建这些的链接描述文件。阅读链接器文档(完整,抱歉),了解链接器如何处理您的处理器架构的这种(和其他)特质。

不知道你用的是什么架构,比如intel处理器在segment里面有一个execution bit的权限,因为他们有读写,也就是说对于一个可执行segment的内存访问必须是opcode获取访问而不是数据读取访问以加载数据寄存器。如果您想访问文本段以进行数据读取,那么您还需要添加对文本段的读取访问权限才能看到您正在执行的代码。

【讨论】:

以上是关于为啥.bss段没有可执行属性?的主要内容,如果未能解决你的问题,请参考以下文章

Linux进程的五个段

[转]深入C语言内存区域分配(进程的各个段)详解

Linux下C程序的存储空间布局

Linux下C程序的存储空间布局

为啥数据和堆栈段是可执行的?

4月13日总结