C语言中奇技淫巧07-使用GCC栈保护选项检测程序栈溢出

-fstack-protector 是 GCC 和 Clang 编译器提供的一种栈保护(Stack Smashing Protection, SSP) 机制,用于检测和防御常见的缓冲区溢出攻击(特别是栈溢出)。它通过在函数的栈帧中插入特殊的“金丝雀值”(canary value)来实现保护。

这个机制的灵感来源于煤矿中的“金丝雀”——矿工会带一只金丝雀下井,如果矿井中有毒气,金丝雀会先死亡,从而警告矿工。
在栈保护中:

  • “金丝雀”:是一个随机的、不可预测的数值。
  • “毒气”:是恶意的缓冲区溢出攻击。
  • “金丝雀死亡”:是金丝雀值被修改,表示栈已被破坏。

1. 保护机制的工作流程

当使用 -fstack-protector 编译时,编译器会在特定函数的栈帧中插入以下内容:

(1) 栈帧布局变化

在未启用保护时,一个典型的栈帧可能如下:

高地址
+------------------+
| 参数             |
+------------------+
| 返回地址         |  <-- 函数返回时跳转的目标
+------------------+
| 旧的栈帧指针     |
+------------------+
| 局部变量         |  <-- 缓冲区溢出可能从此处开始
+------------------+
低地址

启用 -fstack-protector 后,栈帧变为:

高地址
+------------------+
| 参数             |
+------------------+
| 返回地址         |  <-- 攻击者最想覆盖的目标
+------------------+
| 旧的栈帧指针     |
+------------------+
| **金丝雀值**     |  <-- 保护“返回地址”的哨兵
+------------------+
| 局部变量         |  <-- 缓冲区溢出从此处开始
+------------------+
低地址

关键变化:金丝雀值被放置在返回地址和局部变量(尤其是缓冲区)之间

(2) 函数执行过程

  1. 函数入口

    • 编译器生成的代码会在函数开始时,从一个全局安全位置(如线程控制块)读取一个随机的金丝雀值
    • 将这个值写入栈帧中的金丝雀槽
  2. 函数执行

    • 程序正常运行。如果存在缓冲区溢出漏洞(如 strcpy 写入过长的字符串到局部数组),溢出的数据会先覆盖局部变量,然后覆盖金丝雀值,最后才可能覆盖返回地址。
  3. 函数出口

    • 在函数 return 之前,编译器插入的代码会重新读取栈中的金丝雀值
    • 将其与原始的金丝雀值(通常存储在寄存器或安全位置)进行比较。
    • 如果相等:说明栈未被破坏,函数正常返回。
    • 如果不相等:说明金丝雀值被修改(即发生了栈溢出),程序会立即调用一个错误处理函数(如 __stack_chk_fail),通常会导致程序终止(abort),并可能输出错误信息(如 “stack smashing detected”)。

2. -fstack-protector 的不同级别

GCC/Clang 提供了多个级别的栈保护,严格程度递增:

选项保护范围说明
-fstack-protector中等仅保护包含长度大于 8 字节的字符数组的函数,或使用了 alloca() 的函数。这是最常用的级别,平衡了安全性和性能开销。
-fstack-protector-strong较强保护范围更广,包括:
• 包含任意大小的数组的函数
• 包含地址被取走的局部变量的函数
• 使用 alloca() 的函数
• 包含 printf 风格可变参数的函数
在现代编译器中推荐使用此选项。
-fstack-protector-all最强保护所有函数,无论其是否包含易受攻击的变量。性能开销最大,通常用于高安全要求的场景。
-fno-stack-protector显式禁用栈保护(默认不启用,除非系统配置开启)。

3. 金丝雀值的来源与安全性

  • 随机性:金丝雀值通常在程序启动时从系统的随机源(如 /dev/urandom)生成,并存储在每个线程的线程控制块(Thread Control Block, TCB)中。
  • 不可预测性:由于金丝雀值是随机的且对攻击者不可见,攻击者无法轻易构造一个能同时覆盖金丝雀值并将其设置为原始值的 payload,从而绕过检测。
  • 终止符:金丝雀值通常设计为包含字符串终止符 \0 和其他特殊字节,使其难以通过标准的字符串操作函数(如 strcpy)完整写入。

4. 局限性与绕过

尽管 -fstack-protector 非常有效,但它并非万能:

  1. 不保护所有溢出

    • 它主要保护返回地址不被覆盖。
    • 如果溢出只覆盖了其他局部变量(而未到达金丝雀),这种攻击可能不会被检测到(例如“变量篡改”攻击)。
  2. 信息泄露前提下的绕过

    • 如果攻击者能通过其他漏洞(如格式化字符串漏洞)泄露金丝雀值,那么他们就可以在溢出时将金丝雀值恢复,从而绕过保护。
  3. 不防止堆溢出

    • 该机制只保护栈,对堆(heap)上的缓冲区溢出无效。
  4. 性能开销

    • 每个受保护的函数都需要额外的内存(金丝雀槽)和运行时检查(读取、比较),会带来轻微的性能和内存开销。

5. 实际效果

当你在程序中触发一个栈溢出时,如果启用了栈保护,你通常会看到类似这样的错误信息:

*** stack smashing detected ***: <program_name> terminated
Aborted (core dumped)

这表明保护机制成功检测到了栈破坏并终止了程序,防止了更严重的后果(如代码执行)。


6. 总结

-fstack-protector 通过在栈帧中插入一个“金丝雀值”来保护关键数据(如返回地址)。它在函数入口放置金丝雀,在函数出口检查其完整性。如果金丝雀被修改,说明发生了栈溢出,程序会立即终止。这是一种简单、高效且广泛部署的安全防御机制,能有效阻止大量基于栈溢出的攻击,是现代软件安全编译的基本配置之一。推荐在编译时使用 -fstack-protector-strong 以获得更好的保护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96112.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET 8.0 Web API JWT 身份验证和基于角色的授权

在当今的数字环境中&#xff0c;保护 Web 应用程序的安全至关重要。随着 .NET 8.0 的不断发展&#xff0c;它提供了强大的工具来确保您的 API 既安全又高效。 示例代码&#xff1a;https://download.csdn.net/download/hefeng_aspnet/91490262 如果您喜欢此文章&#xff0c…

ZYNQ SDK软件在线调试

1、然后右键项目->debug as->launch on hardware2、从左到右分别是&#xff1a;运行程序到设置的断点暂停运行终止断开连接步进&#xff08;进入函数内部&#xff09;跳过&#xff08;不进入函数内部&#xff09;跳出函数3、双击添加断点&#xff0c;然后点击运行可以让程…

四大金刚之计算机操作系统

1. 进程和线程的区别&#xff1f;创建线程的代价比创建进程小吗&#xff1f;进程是资源分配和调度的基本单位&#xff1b;线程是 CPU 调度的基本单位。进程有独立的地址空间&#xff0c;线程共享进程地址空间。创建/销毁进程开销大&#xff0c;线程开销小。是的&#xff0c;因为…

redis--redis.conf的相关配置问题

关于redis.conf内的相关重要的配置介绍 1. bind 配置 仅仅设置bind&#xff0c;还需要搭配下面的rotected-mode 配置才能外部ip进行连接 功能&#xff1a;设置 Redis 监听的 IP 地址&#xff0c;决定哪些设备可以连接到 Redis 服务器。 bind 127.0.0.1&#xff1a;只允许本机&a…

unsloth 笔记:从最近的检查点继续微调

检查点&#xff08;checkpointing&#xff09;可以把微调进度保存下来&#xff0c;这样可以中途暂停&#xff0c;随后继续训练。首先需要在 Trainer 的参数里添加 save_strategy 和 save_steps。trainer SFTTrainer(....args TrainingArguments(....output_dir "output…

DevOps平台选型指南:破解研发效率瓶颈,适配金融/政务/国产化场景的5大关键指标

在数字化转型的浪潮中&#xff0c;软件研发效能已成为企业的核心竞争力。然而&#xff0c;许多团队在追求敏捷与高速交付的过程中&#xff0c;常常会遇到工具链割裂、流程冗长、环境混乱等效率瓶颈。选择一个合适的、一体化的DevOps平台&#xff0c;是破解这些瓶颈、实现研发运…

【面试向】元宇宙介绍

属于基础知识介绍&#xff0c;主要目的是对这一概念有技术层面的理解&#xff0c;有前瞻性的观点&#xff0c;帮助大家在面试中给出得体的表述。 1. 什么是元宇宙&#xff1f; 元宇宙本质上是一个融合了数字与现实、由技术构建的 “沉浸式虚拟空间”&#xff0c;是一个 “超越…

FreeMarker快速入门指南

FreeMarker快速入门指南 FreeMarker是一个基于模板和数据模型生成文本输出的Java库。它广泛应用于Web开发、代码生成、邮件模板等场景。本文将带你快速上手FreeMarker的核心概念和基本用法。 什么是FreeMarker FreeMarker是一个模板引擎&#xff0c;它将模板文件&#xff08;.f…

Nginx主配置文件

一&#xff0c;Nginx基本介绍1&#xff0c;nginx概念Nginx 是一款轻量级、高性能的服务器软件&#xff0c;核心能力是 “处理网络请求”&#xff0c;被广泛用于网站、App 的后端架构中。Nginx 就像一个 “高效的网络交通指挥官”&#xff0c;核心价值是用最少的资源&#xff0c…

基于ResNet50的智能垃圾分类系统

基于ResNet50的智能垃圾分类系统&#xff1a;从理论到实践的完整指南 源码获取https://mbd.pub/o/bread/YZWXlZ1yZg 引言&#xff1a;智能垃圾分类的时代背景与意义 随着城市化进程的加速和人口数量的增长&#xff0c;垃圾处理问题日益成为全球性的环境挑战。传统的垃圾分类…

灾难性遗忘:神经网络持续学习的核心挑战与解决方案

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 1. 灾难性遗忘的定义与核心问题 灾难性遗忘&#xff08;Catastrophic…

OPENPPP2 —— IP标准校验和算法深度剖析:从原理到SSE2优化实现

&#x1f50d; OPENPPP2 —— IP标准校验和算法深度剖析&#xff1a;从原理到SSE2优化实现 引用&#xff1a; IP校验和算法&#xff1a;从网络协议到SIMD深度优化IP校验和算法&#xff1a;从标量到SIMD的高级优化&#xff08;SSE4.1&#xff09; GDB online Debugger C17 Co…

4.4 机器学习 - 集成学习

集成学习通过 “组合多个基础模型” 提升泛化能力&#xff0c;核心分为并行集成&#xff08;Bagging&#xff09;、串行集成&#xff08;Boosting&#xff09; 和多层集成&#xff08;Stacking&#xff09; 三大范式&#xff0c;分别对应 “降方差”“降偏差”“兼顾偏差与方差…

机器学习 - 使用 ID3 算法从原理到实际举例理解决策树

一、什么是决策树1.基本概念决策树是一种树形结构&#xff0c;由结点&#xff08;node&#xff09; 和有向边&#xff08;directed edge&#xff09; 组成。其中结点分为两类&#xff1a;内部结点&#xff08;internal node&#xff09;&#xff1a;表示一个属性&#xff08;特…

【期末复习】嵌入式——S5PV210开发板

本文为嵌入式课程期末复习&#xff0c;仅供参考&#xff0c;所用课本&#xff1a;嵌入式Linux操作系统&#xff08;李建祥著&#xff09;。第一章1.1 简述嵌入式微处理器数据存储格式的大&#xff0c;小端模式。大端模式是指数据的高字节保存在内存的低地址中&#xff0c;而数据…

word文档结尾批量插入图片 docx批量插入图片 指定几张

如果你有一些word文档。比如工作总结。你想每一个文档里面都插入几张图片。插入到每个文档的结尾&#xff0c;那么你可以使用这个工具。首先准备好你的文档。然后把它们拖进右边的方框中。拖动的时候&#xff0c;拖动第一个&#xff0c;然后准备好你的图片。把你的图片全部拖动…

CodeBuddy国际版又更新了体验感1

CodeBuddy国际版又更新了 更好的使用体验更少的资源消耗合理的消耗剩余资源使用起来也是很不错的&#xff0c;这次更新自动模式想不到的少&#xff0c;可以用于其他的例如翻译与写测试用例或者其他的说明文档等或者是阅读一下项目更好了解项目总的上来说 使用体验响应速度还是不…

基于开源AI智能名片链动2+1模式S2B2C商城小程序的公益课引流策略研究

摘要&#xff1a;本文聚焦公益课引流场景&#xff0c;探讨开源AI智能名片、链动21模式与S2B2C商城小程序的融合应用。通过构建低成本用户裂变体系&#xff0c;分析该技术组合在精准筛选、社群运营、激励机制设计中的协同效应。研究提出"智能名片画像-链动裂变激励-S2B2C生…

季度最强策略:年化247%,回撤10%,夏普比率3.79。附大小盘轮动策略python源代码。

原创内容第993篇&#xff0c;专注AGI&#xff0c;AI量化投资、个人成长与财富自由。 季度最强策略&#xff1a; 年化247%&#xff0c;回撤10%&#xff0c;夏普比率3.79。3积分可查看参数。 大小盘轮动的策略源代码&#xff1a; 年化收益18.8%。 from engine import Task, Eng…

testng.xml

一、TestNG.xml 是 TestNG 测试框架的核心配置文件&#xff0c;用于组织和控制测试执行。通过它&#xff0c;可以灵活地管理测试套件、测试类、方法&#xff0c;并设置各种执行参数一个基本的 testng.xml文件通常以 ​​DOCTYPE 声明​​开头&#xff0c;并遵循特定的文档类型定…