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

2023-12-12

我刚刚注意到我的简单程序的数据和堆栈段是可执行的。 我在 /proc/[pid]/maps 中看到它,并且简单的代码证实了这一点。

例如:

; prog.asm
section .data
    code:   db 0xCC    ;int3

section .text
global _start
_start:
    jmp    code

    mov    rax, 60    ; sys_exit
    mov    rdi, 0
    syscall

then

nasm -f elf64 prog.asm
ld -o prog prog.o
./prog

使程序执行int3指令。

用 C 编写并使用 gcc 构建的程序的数据、堆栈和堆不可执行,那么为什么用汇编语言编写的程序会有不同的行为呢?


在现代 Linux 系统上,链接器会将堆栈/数据标记为不可执行IFF参与链接的所有对象都有一个特殊的“标记”部分.note.GNU-stack.

如果你编译例如int foo() { return 1; }进入装配体(与gcc -S foo.c),你会看到这个:

    .section    .note.GNU-stack,"",@progbits

For nasm,语法如手册第 8.9.2 节;你想要这样的东西:

 section .note.GNU-stack noalloc noexec nowrite progbits

Note

必须这样做every .o进入可执行文件的文件。如果任何目标文件需要可执行堆栈或数据,则为整个段设置它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么数据段和堆栈段是可执行的? 的相关文章

  • 在 qemu 中将扇区加载到 RAM

    我编写了一个简单的程序 将扇区 扇区编号 2 加载到 RAM 但什么也没打印 首先 我尝试了以下引导扇区代码 org 0x7c00 mov ax 0x1000 ES BX 1000 0000 mov es ax mov bx 0x00 Lo
  • 在用户程序中使用 或在驱动程序模块代码中使用 ...这有关系吗?

    我正在开发一个设备驱动程序模块和关联的用户库来处理ioctl 来电 该库获取相关信息并将其放入一个结构中 该结构被传递到驱动程序模块中并在那里解压 然后进行处理 我省略了很多步骤 但这就是总体思路 一些数据通过结构体传递ioctl is u
  • 如何回忆上一个 bash 命令的参数?

    Bash 有没有办法回忆上一个命令的参数 我通常这样做vi file c其次是gcc file c Bash 有没有办法回忆上一个命令的参数 您可以使用 or 调用上一个命令的最后一个参数 Also Alt can be used to r
  • 测试 xmm/ymm 寄存器是否为零的更快方法?

    It s fortunate that PTEST does not affect the carry flag but only sets the rather awkward ZF also affects both CF and ZF
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset
  • 为什么无论 -rdynamic 如何,backtrace 都不包含 Objective-C 符号?

    Update 我正在 Linux 上使用 GNU 运行时 问题是not发生在带有 Apple 运行时的 MacOS 上 更新2 我在 MacOS 上编译了 GNU 运行时并用它构建了示例 该错误确实not发生在带有 GNU 运行时的 Mac
  • 如何在汇编中使用 ReadString?

    mov edx offset Prompt1 call WriteString mov ecx 32 mov edx offset String1 call ReadString 现在 我该如何访问String1 如何将其移入寄存器以便对其
  • 如何使用 nohup 获取正在运行的程序列表

    我正在通过 SSH 连接访问运行 CentOS linux 发行版 的服务器 由于我无法始终保持登录状态 因此我使用 nohup command 来运行我的程序 我找不到如何获取我开始使用 nohup 的所有程序的列表 工作 只有在我注销之
  • 如何使 gcc 为 -fpatchable-function-entry 发出多字节 NOP?

    gcc确实有能力使用多字节用于对齐循环和函数的 NOP 然而当我尝试 fpatchable function entry option https gcc gnu org onlinedocs gcc Instrumentation Opt
  • grep 彩色线条

    我编写了一个简单的 PHP shell 脚本 它解析文件并输出某些元素 它产生大量的输出 采用不同的 bash 颜色 绿色表示正常 黄色表示警告 红色表示错误等 在开发过程中我想过滤掉一些行 例如 所有包含红色文本的行 我可以使用grep
  • 如何在 Ubuntu/Linux 发行版中安装 Tesseract-OCR 3.03?

    我和一个朋友有兴趣为 CV 项目训练 tesseract OCR 引擎 我们尝试使用一些包装器 例如 PyTesser 和 pyocr 但结果目前不如我们需要的那么准确 因此 我们希望尝试训练超立方体以更好地实现我们的目的 即识别食品标签上
  • Linux 上的“软/硬 nofile”是什么意思

    当我尝试在RedHat EL5上安装软件时 我得到了错误 软 硬nofile的期望值是4096 而默认值是1024 我设法增加了这个数字 但我不知道参数是什么 他们指的是软链接和硬链接吗 我改变的方法是 a 修改 etc security
  • 如何阅读英特尔操作码符号

    我正在阅读一些引用的材料Intel vol 2 SDM x86 手册 https www intel com content www us en developer articles technical intel sdm html关于汇编
  • 在 Windows / Linux 中创建 Mac 包

    我自己努力制作一个 r 包 我按照 stackoverflow 中上一个问题的说明进行操作如何为外行开发软件包 http cran r project org bin windows Rtools 以下是我根据上一个问题采取的步骤 在新的
  • 如何在C程序中直接改变显存映射来绘制像素(无需库函数)

    是否可以通过使用 C 程序更改 RAM 中屏幕 视频即监视器 内存映射中的值来显示黑点 我不想使用任何库函数 因为我的主要目标是学习如何开发简单的操作系统 我尝试访问起始屏幕内存映射 即 0xA0000 在 C 中 我尝试运行该程序 但由于
  • 删除 Python 中某些操作的 root 权限

    在我的 Python 脚本中 我执行了一些需要 root 权限的操作 我还创建并写入文件 我不想由 root 独占所有 而是由运行我的脚本的用户独占所有 通常 我使用以下命令运行脚本sudo 有办法做到上述吗 您可以使用以下方式在 uid
  • 在 MacO 和 Linux 上安装 win32com [重复]

    这个问题在这里已经有答案了 我的问题很简单 我可以安装吗win32com蟒蛇API pywin32特别是 在非 Windows 操作系统上 我一直在Mac上尝试多个版本pip install pywin32 都失败了 下面是一个例子 如果你
  • 在Linux中创建可执行文件

    我计划做的一件事是编写 非常简单的 Perl 脚本 并且我希望能够在不从终端显式调用 Perl 的情况下运行它们 我明白 要做到这一点 我需要授予他们执行权限 使用 chmod 执行此操作非常简单 但它似乎也是一个稍微费力的额外步骤 我想要
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul

随机推荐

  • python 中使用 O(1) 空间的自底向上斐波那契

    我想使用 O 1 空间编写自下而上的斐波那契数 我的问题是 python 的递归堆栈限制了我测试大量数据 有人可以为我所拥有的提供替代或优化吗 这是我的代码 def fib in place n def fibo f2 f1 i if i
  • 激活手电筒应用程序的 LED

    我正在尝试为我的 iPhone 制作一个手电筒应用程序 我有一部 iPhone 4 想在我的项目中使用 iPhone 上的 LED 谁能帮助我开始使用它 这是一个较短的版本 您现在可以使用它来打开或关闭 LED void torchOnOf
  • 如何从 ASP.NET Web 应用程序在特定时间发送邮件

    我是 ASP NET 新手 我有一个项目正在运行 我需要每天中午12点向不同的用户发送不同的邮件 我需要知道如何实现每天在某个时间段醒来的方法 请帮助我提供尽可能多的细节 因为我是一个完全的初学者 Use 石英网 Quartz NET 是一
  • 将 Imgur API 与 Angular4 结合使用

    我正在使用 Angular 开发一个 Web 应用程序 但在使用 Imgur API 时遇到问题 我的目标是建立一个表单 用户可以选择其照片 然后将其上传到 imgur 并将链接存储在存储图像的位置 但是 我有两个问题 存储 图像的最佳方式
  • 如何构建 mtp 设备的路径(可在文件夹浏览对话框中使用)?

    我实现了从Windows PC到Android设备的文件传输 该设备通过MTP连接到计算机 复制实现已准备就绪 我使用了这个示例 http code msdn microsoft com windowsdesktop Portable De
  • NodeJS/express:缓存和 304 状态码

    当我重新加载使用express制作的网站时 我在Safari 而不是Chrome 中得到一个空白页面 因为NodeJS服务器向我发送了304状态代码 怎么解决这个问题呢 当然 这也可能只是 Safari 的问题 但实际上它在所有其他网站上都
  • 在python中设置http响应读取方法的超时

    我正在用 python 构建一个下载管理器来娱乐 有时与服务器的连接仍然存在 但服务器不向我发送数据 因此 HTTPResponse 的 读取方法永远阻止我 例如 当我从位于我国境外的服务器下载时 就会发生这种情况 这会限制其他国家 地区的
  • 如何从命令行设置列表类型的 CMake 变量

    我正在尝试做这样的事情 cmake G Visual Studio 15 2017 Win64 DCMAKE CONFIGURATION TYPES ReleaseDebug But the CMAKE CONFIGURATION TYPE
  • 使用线程安全更新单例的属性

    我们的设置是 Asp NET MVC5 使用 AutoFac 进行 DI 我们有一个类 单例 它管理各种服务的访问令牌 有时 这些令牌即将到期 不到 10 分钟 我们会请求新令牌并刷新它们 我当前的实现如下所示 member int use
  • 将 R 中 data.frame 的每一列中的所有值相加

    给定这个数据集 Name Height Weight 1 Mary 65 110 2 John 70 200 3 Jane 64 115 我想对每个限定符列 身高和体重 求和 199 425 问题是限定符可能不止 2 个 即更多 不仅仅是身
  • JSF 为组件声明定义自定义命名空间

    当您在 JSF 页面中使用外部库 或自定义组件 中的组件时 您需要添加 xmlns 声明 例如 xmlns util http java sun com jsf composite component util 我想知道如何在 Namasp
  • 如何从视图中调用控制器 - Laravel

    我有一个列出时间表的视图 在该视图上 每个时间表都有一个可交付成果字段 我有一个 DeliverableController 它有一个操作 DropdownList 该操作调用模型并获取可交付成果列表并将它们推送到可交付成果视图 这只是创建
  • 如何给jqgrid添加Tooltip

    我正在使用 jqgrid 显示服务器中存在的数据 如何在鼠标悬停工具提示上显示数据描述 在 jqgrid 上显示工具提示的最佳方式是什么 鼠标悬停时 jqGrid 中显示的工具提示只不过是相应 HTML 元素的 标题 属性 如果您想更改工具
  • Java将字符串转换为日期然后比较

    我有一个二维字符串数组 static String TaskStorage Task 1 02 07 13 Task 2 02 08 13 Task 3 02 09 13 Task 4 02 10 13 Task 5 02 11 13 Ta
  • Python - 按索引对列表列表中的重复项进行分组

    我见过很多关于从列表中删除重复项并对其进行计数的问题 但我正在尝试找到将它们分组的最佳方法 列表列表 鉴于此示例 我想按第三个字段进行分组 1 text name1 text 2 text name2 text 3 text name2 t
  • 编译时依赖注入[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 为什么所有 DI 框架都会在应用程序启动之前检查运行时的所有依赖关系 为什么不在编译时检查这一点 这样做有什么好处呢 是否可以更改已部署应用程序中的依赖关系 例如 当应用程序启动
  • 如何在页面刷新时保持选定/活动的 HTML 链接颜色?

    EDIT 我想要保持选中状态 在页面刷新时保持 HTML 链接颜色 我尝试了其他已经得到解答但对我不起作用的问题 例如 当我单击 HTML 链接时 将 HTML 链接分类Quizzes它将把颜色更改为红色 并保持页面上的颜色刷新 HTML
  • 自定义异常类每次都显示 Unreachable catch 块

    我创建了一个自定义异常类 我想在我的应用程序中使用它 public class MyException extends Exception private static final long serialVersionUID 2151515
  • Mysql 搜索以逗号分隔的字符串

    我有 1 个名为的 mysql 表colors有行id and name 1 yellow 2 black 3 red 4 green 5 white 6 blue 例如 如果我有搜索字符串 如何获取 ID 数组 colors gt str
  • 为什么数据段和堆栈段是可执行的?

    我刚刚注意到我的简单程序的数据和堆栈段是可执行的 我在 proc pid maps 中看到它 并且简单的代码证实了这一点 例如 prog asm section data code db 0xCC int3 section text glo