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

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(使用前将#替换为@)

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

  • Linux 内核中是否使用了扩展指令集(SSE、MMX)?

    好吧 它们带来 至少应该带来 性能的巨大提升 不是吗 所以 我还没有看到任何 Linux 内核源代码 但很想问 它们是否以某种方式被使用 在这种情况下 对于没有此类指令的系统 必须有一些特殊的 代码上限 SSE 和 MMX 指令集在音频 视
  • 设置 nginx 具有多个 IP

    我的 nginx 配置文件位于 etc nginx sites available 下 有两个上游说 upstream test1 server 1 1 1 1 50 server 1 1 1 2 50 upstream test2 ser
  • RTNETLINK回答:没有这样的文件或目录错误

    1 ETH 1 2 LATENCY 2 3 LOSS 3 4 JITTER 4 5 BW 5 6 sudo sbin tc qdisc del dev eth0 root 7 sudo sbin tc qdisc add dev eth0
  • 在 Linux 上,当打开套接字时,Java 会发出反向 DNS 查找。为什么,我该如何阻止它?

    我们在 Linux 上遇到了一种非常奇怪的行为 Java DNS 查找 更新 Mac OS X 上也会发生 我错了 我们将Google公共DNS服务器8 8 8 8设置为JVM DNS服务器 然而 系统 etc resolv conf 服务
  • 如何通过jiffies实现经过时间

    我想了解如何在 C 中使用 jiffies 实现经过时间 假设我有一系列指令 include
  • Linux:如何调试 SIGSEGV?如何追踪错误源?

    我的火狐浏览器从今天开始崩溃了 我没有更改系统或 Firefox 配置上的任何内容 I use strace ff o dumpfile txt firefox来追踪问题 这没什么大帮助 我在两个生成的进程转储中看到了段错误 但我怎样才能t
  • X86 汇编将小写字母转换为大写字母

    实现toUpper函数 将字符串中的小写字母转换 为大写 该函数采用一个参数 char string 字符串是一个 char类型指针 指向字符串的开头 因为C 样式字符串以零结尾 我们不需要取长度 字符串作为另一个参数 我需要帮助开始 我不
  • 16位汇编:无法取消引用某些寄存器[重复]

    这个问题在这里已经有答案了 我正在尝试以下 Intel 16 位指令 mov si word reg where reg是一些寄存器 它编译得很好 如果reg is bx 但当它是ax cx or dx 我使用 NASM 作为我的汇编器 我
  • Linux CFS 调度程序代码在哪里?

    我有3 13版本的完整linux源代码 我试图找到 CFS 调度程序的源代码 根据流行书籍 它应该驻留在 kernel sched c 中作为基本调度程序代码 而 kernel sched fair c 专门针对 CFS 代码 我刚刚在 3
  • 从多个进程附加到单个文件的“线程安全”?

    假设我有 X 个进程打开文件 Y 进行追加 每个进程一次只写入一行 带有 n 真正的日志条目 文件 Y 中的每一行是否保证不会错误地交错 更新 本地附加文件系统 问题取决于正在进行什么类型的写入 如果您使用带缓冲的标准 I O 这通常是大多
  • rusage 进程/线程的 Cpu 时间不可能

    我正在计算进程 线程正在使用的 cpu 时间之间的增量 以及某个函数的调用之间的增量 我得到了进程 cpu 时间不可能的值 有时下一次调用会返回较小的 cpu 时间 这是不可能的 这是我用来计算CPU时间的代码 u64 CpuTime ca
  • 如何将域名附加到我的服务器? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有一个小问题 查看了这里和其他论坛 但找不到解决方案 我的网站位于 my domain com 网站位于共享主机上 在我的域名注册中 我添加了当我为
  • 无法使用 linux perf 对硬件缓存事件进行采样

    由于某种原因 我无法采样 perf record 硬件缓存事件 perf record e L1 dcache stores a c 100 sleep 5 perf record Woken up 1 times to write dat
  • 如何在Linux中诊断Python进程占用CPU

    我的 python 进程在自动化脚本中的某个时刻开始在基于 Linux 的系统 Ubuntu 上占用 CPU 我正在尝试在 GDB 中调试这个问题 我对 GDB 还很陌生 是否有任何 GDB 命令可以提供有关哪个线程正在使用大部分 cpu
  • 无法从 Windows GUI 工具连接到远程 Linux 服务器上的 MySql 数据库

    我已经在 Amazon EC2 上的 Linux 服务器上设置了 mysql 数据库 这在本地效果很好 我可以登录 linux 盒子并管理 mysql 数据库 我正在尝试将本地 GUI 客户端连接到远程 mysql 但连接失败 我更新了 e
  • 使用 tac 和 sed 反转文件

    我有一个用例 我需要搜索并替换文件中最后一次出现的字符串并将更改写回文件 下面的案例是该用例的简化版本 我正在尝试反转该文件 进行一些更改 再次将其反转并写入该文件 我为此尝试了以下代码片段 tac test sed s a b sed i
  • 调用/返回/jmp等后x86代码执行?

    我希望这个问题不会太愚蠢 因为它看起来似乎很明显 当我对缓冲区溢出进行一些研究时 我偶然发现了一个简单的问题 调用 返回 跳转后转到新指令地址后 CPU是否会执行该地址处的OP代码 然后将一个字节移动到下一个地址并执行下一个OP代码 依此类
  • SO_BINDTODEVICE Linux 套接字选项的问题

    我有一台带有两个网卡的电脑 一 eth0 用于 LAN 互联网 另一个用于与一个微控制器设备进行 UDP 通信 微控制器有一个 IP 192 168 7 2 和一个 MAC 地址 第二个电脑网络适配器 eth1 有 192 168 7 1
  • Linux shell 根据第二列对文件进行排序?

    我有一个这样的文件 FirstName FamilyName Address PhoneNumber 如何按 FamilyName 排序 如果这是 UNIX sort k 2 file txt 您可以使用多个 k用于对多列进行排序的标志 例
  • Bash:检查是否给出了参数(例如是否有参数“-a”?)

    我有一个脚本 它应该接受 2 个参数 s 和 d 如果未给出 d 参数 我想删除我的调试文件 与 s 相同 如何检查 1 或 2 是否为 s 或 d 舒尔有两个参数 我可以做到 蛮力 if test 1 d test 2 d then rm

随机推荐

  • 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