gcc execstack 标志到底允许什么情况以及它如何强制执行它?

2023-12-19

我这里有一些示例代码,我用它们来理解初学者 CTF 的一些 C 行为:

// example.c

#include <stdio.h>


void main() {
        void (*print)();

        print = getenv("EGG");
        print();
}

编译:gcc -z execstack -g -m32 -o example example.c

Usage: EGG=$(echo -ne '\x90\xc3) ./example

如果我用以下代码编译代码execstack标志,程序将执行我上面注入的操作码。如果没有该标志,程序将由于分段错误而崩溃。

到底是为什么呢?是不是因为getenv正在将实际操作码存储在堆栈上,并且 execstack 标志允许跳转到堆栈吗?或者确实getenv将指针压入堆栈,并且还有一些关于哪些内存部分可执行的其他规则?我阅读了联机帮助页,但无法确切地弄清楚规则是什么以及它们是如何执行的。

另一个问题是我认为我也确实缺乏一个在调试时可视化内存的好工具,所以很难弄清楚这一点。任何建议将不胜感激。


getenvstore堆栈上环境变量的值。它是already从进程启动开始就在堆栈上,并且getenv获得一个指向它的指针。

请参阅 i386 System V ABI 对进程启动时 argv[] 和 envp[] 所在位置的描述:上面[esp].

_start在调用之前不会复制它们main,只是计算指向它们的指针作为参数传递给main。 (最新版本的链接位于https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI,其中维护官方当前版本。)


您的代码将指向堆栈内存(包含环境变量的值)的指针转换为函数指针并通过它进行调用。查看编译器生成的 asm(例如https://godbolt.org/ https://godbolt.org/): 会是这样的call getenv / call eax.

-zexecstack in your kernel version1 makes all your pages executable, not just the stack. It also applies to .data, .bss, and .rodata sections, and memory allocated with malloc / new.

GNU/Linux 上的确切机制是“read-implies-exec”进程范围标志,它会影响所有未来的分配,包括手动使用mmap. See 当程序集文件包含在项目中时,来自 mmap 的意外执行权限 https://stackoverflow.com/questions/58260465/unexpected-exec-permission-from-mmap-when-assembly-files-included-in-the-project了解更多关于GNU_STACKELF 头的东西。

脚注1:Linux 5.4 左右之后仅使堆栈本身可执行,而不是 READ_IMPLIES_EXEC:Linux 可执行文件 .data 部分的默认行为在 5.4 和 5.9 之间发生了变化? https://stackoverflow.com/questions/64833715/linux-default-behavior-against-data-section/64837581#64837581

有趣的事实:获取访问其父局部变量的嵌套函数的地址可以让 gcc 启用-zexecstack。它将可执行“蹦床”的代码存储到堆栈上,该堆栈将“静态链”指针传递给实际的嵌套函数,从而允许它引用其父级的堆栈帧。


如果您想将数据作为代码执行而无需-zexecstack,你会用mprotect(PROT_EXEC|PROT_READ|PROT_WRITE)在包含该环境变量的页面上。 (它是堆栈的一部分,因此您不应删除写入权限;例如,它可能与 main 的堆栈框架位于同一页面中。)


Related:

使用 GNU/Linuxld在 2018 年末左右之前从 binutils 中,.rodata部分链接到与.text部分,因此const char code[] = {0xc3}或字符串文字是可执行的。

Current ld gives .rodata它自己的段在没有 exec 的情况下映射读取,因此不再可能在只读数据中找到 ROP / Spectre“小工具”,除非您使用-zexecstack。即使这样也不适用于当前的内核;char code[] = ...;作为函数内部的局部变量,会将数据放在实际可执行的堆栈上。看如何让c代码执行hex机器代码? https://stackoverflow.com/questions/9960721/how-to-get-c-code-to-execute-hex-machine-code/55893781#55893781了解详情。

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

gcc execstack 标志到底允许什么情况以及它如何强制执行它? 的相关文章

  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • 以编程方式读取 SQL Server 查询计划建议的 SQL 特定执行的索引?

    如果我在 SSMS 中运行此命令 set showplan xml on GO exec some procedure arg1 arg2 arg3 GO set showplan xml off GO 我获得查询执行中涉及的完整调用堆栈的
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • 为什么在 WebApi 上下文中在 using 块中使用 HttpClient 是错误的?

    那么 问题是为什么在 using 块中使用 HttpClient 是错误的 但在 WebApi 上下文中呢 我一直在读这篇文章不要阻止异步代码 https blog stephencleary com 2012 07 dont block
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • 使用可变参数包类型扩展的 C++ 函数调用者包装器

    我绑定了一些 API 并且绑定了一些函数签名 如下所示 static bool WrapperFunction JSContext cx unsigned argc JS Value vp 我尝试将对象和函数包装在 SpiderMonkey
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 为什么从字典中获取时会得到 Action<> 的克隆?

    我有以下字典 private Dictionary
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 在 Windows Phone silverlight 8.1 上接收 WNS 推送通知

    我有 Windows Phone 8 1 silverlight 应用程序 我想使用新框架 WNS 接收通知 我在 package appxmanifest 中有
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • ubuntu:升级软件(cmake)-版本消歧(本地编译)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的机器上安装了 cmake 2 8 0 来自 ubuntu 软件包 二进制文件放置在 usr bin cmake 中 我需要将 cmake 版本至少

随机推荐

  • 动态多级菜单php的递归函数

    I ve a mysql表结构如下 CREATE TABLE IF NOT EXISTS menu id INT 5 NOT NULL AUTO INCREMENT PRIMARY KEY p id INT 5 parent id sort
  • 使用 pip 安装factory_boy 时遇到问题

    我正在开发一个 Django 项目 我正在另一台机器上设置环境 当我运行时pip install factory boy 我得到以下回溯 https gist github com JSweetman 35f59536d6b87a0ce8c
  • 两个对象矩阵相乘的有效方法

    作为程序的一部分 我需要将两个二维矩阵相乘 这些矩阵是创建的 Matrix 类的一部分 我现在的代码运行良好 但我想知道是否有更有效的方法将这些矩阵相乘 public Matrix multiply Matrix matrix return
  • Laravel - 使用 AngularJS 访问关系模型

    我正在尝试创建一个单页应用程序 以 AngularJS 作为前端 以 Laravel 作为后端 我在尝试创建需要访问与另一个模型的关系的表时遇到了问题 对于此示例 假设我有一个显示产品的表格 每个产品也会有一个品牌 使用 Laravel 的
  • Flutter web GestureDetector:检测鼠标滚轮事件

    我正在开发一个用于网络的颤振应用程序 当我在小部件 不是滚动小部件 内滚动鼠标滚轮时 我试图执行回调方法 我知道MouseRegion小部件 并使用Listener作为它的孩子我可以检测到onPointerSignal事件 当Listene
  • React Native应用程序在打开后不断关闭而不崩溃

    我使用链接发布了我的 apk 文件https reactnative dev docs signed apk android https reactnative dev docs signed apk android我将它安装在我的 And
  • 使用 GlobalMaterialLocalizations.delegate 会出现错误

    编辑 答案很简单 await initializeDateFormatting pl PL 上面的代码与以下内容冲突 GlobalMaterialLocalizations delegate 删除initializeDateFormatti
  • git Remote 似乎不是 git 存储库 (dokku)

    我刚刚使用 ubuntu 14 04 x64 创建了一个数字海洋服务器 创建后 我设置了 ssh 访问权限 并下载了 dokku 需要运行命令两次 但这是一个常见问题 Command wget qO https raw github com
  • SpeechRecognizer:未选择语音识别服务

    这就是我开始我的 RecogniseListener 意图的方式 Intent intent new Intent RecognizerIntent ACTION RECOGNIZE SPEECH intent putExtra Recog
  • 如何声明一个 Class 对象,使其成为 Java 中的枚举和接口

    我有一个实用程序类 需要在通用类上工作 但必须仅限于那些枚举并实现特定接口的类 These two work Class gt enumClass Class gt enumAndInterfaceClass 对于泛型我可以成功使用它 pu
  • React组件回调实现方法有什么区别

    import React from react import ChildComponent from ChildComponent class SampleComponent extends React Component sampleCa
  • 如何在 cefsharp WPF 项目中加载扩展?

    我正在尝试在 WPF 项目中的 cefsharp 嵌入式浏览器中加载扩展 但这样做时应用程序会冻结 这是我一直在加载一个非常简单的扩展的代码 var setting new CefSettings setting RegisterExten
  • 类型不可序列化,因为它不是公共的?

    我有一个无法正确序列化的公共类 尝试时 会引发以下异常 数据协定类型 MyProject MyClass 不可序列化 因为它不是公共的 公开该类型将修复此错误 或者 您可以将其设置为内部 并使用程序集上的 InternalsVisibleT
  • 控制java调度算法

    今天我和一位有趣的受访者交谈 他坚持认为提高 Java 应用程序性能的最佳方法是重写线程调度算法 鉴于我们依赖 JVM 线程调度算法 我有理由确信这是不可能的 但我想知道是否有任何技术可以用来影响调度算法 或者如果有一个令人信服的理由这样做
  • 在此 P/Invoke 用例中正确使用 SafeHandles

    在 C 中使用本机 Dll 使用不透明句柄和内部引用计数 我有以下 P Invoke 签名 全部用 DllImport 属性装饰 DllImport somedll dll public extern IntPtr getHandleOfA
  • 等值线世界地图

    我读了很多帖子和文章 但不断出现错误 我正在尝试制作一个等值线 使用我从全球恐怖主义数据库获得的数据绘制的世界地图 我想根据击杀次数或仅根据该国家 地区的攻击次数对国家进行着色 我现在不在乎 由于拥有数据的国家太多 因此绘制任何图表来显示这
  • 通过 VIM 选择 Python 函数的最快方法是什么?

    没有任何插件可以吗 或者编辑 python 文件的最佳插件是什么 try vis直观地选择和o跳跃边缘
  • 来自工作人员的错误消息: generic::aborted: SDKharness sdk-0-1 已断开连接

    我的一项 Dataflow 作业遇到一些问题 我有时会收到此错误消息 似乎在这个错误之后 作业一直运行良好 但是 今天晚上它实际上卡住了 或者它开始缓慢地处理元素 您还可以从屏幕截图中看到 工作人员开始表现得非常奇怪 如下面屏幕截图中的 C
  • 您可以在 iPhone/iPad 上的视图之间进行转换的完整列表 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • gcc execstack 标志到底允许什么情况以及它如何强制执行它?

    我这里有一些示例代码 我用它们来理解初学者 CTF 的一些 C 行为 example c include