缓冲区溢出

news2024/11/24 8:29:06

本文作者:杉木@涂鸦智能安全实验室

前置知识点

栈(Stack)是计算机中的一种数据结构,用于存储临时数据。它的特点是后入先出(LIFO),只能在栈顶添加或删除数据。在程序中,栈被用于存储函数调用时的临时变量,以及用于控制程序执行流程的返回地址。

堆(Heap)是计算机中的一种数据结构,它是程序在运行时动态分配的内存。与栈相比,堆的结构并无特定的规则,可以随时在堆上分配或释放内存。在程序中,堆通常被用于存储需要在函数调用之间持久存在的数据。

寄存器

寄存器的类型

寄存器的类型和用途各不相同,它们包括但不限于:

  1. 通用寄存器:可以用来存储数值或内存地址,并在各种操作中使用。
  2. 专用寄存器:对操作系统或CPU操作有特殊影响的寄存器。
  3. 数据寄存器:存储数值数据,用于算术、逻辑等操作。
  4. 地址寄存器:存储内存地址,允许CPU访问和操作内存中的数据。
    • 程序计数器(PC):存储即将执行的下一条指令的地址。
    • 基址寄存器(Base Register):与索引寄存器一起用于数组和字符串操作。
    • 堆栈指针(Stack Pointer):指向当前顶部的堆栈的地址。
  5. 指令寄存器(Instruction Register):存储当前被执行的指令。
  6. 状态寄存器/标志寄存器(Status Register / Flags Register):反映了CPU最近操作的各种数学和逻辑条件。

ESP

ESP(Stack Pointer)是堆栈指针寄存器,存放执行函数对应栈帧的栈顶地址(也是系统栈的顶部),且始终指向栈顶;

EBP

EBP(Base Pointer)是栈帧基址指针寄存器,存放执行函数对应栈帧的栈底地址,用于C运行库访问栈中的局部变量和参数。

EIP

EIP(Instruction Pointer)是指令寄存器,指向处理器下条等待执行的指令地址(代码段内的偏移量),每次执行完相应汇编指令EIP值就会增加。

不同架构之间的差别

x86

函数参数函数返回地址的上方

x64

  • System V AMD64 ABI (Linux、FreeBSD、macOS 等采用) 中前六个整型或指针参数依次保存在 RDI, RSI, RDX, RCX, R8 和 R9 寄存器中,如果还有更多的参数的话才会保存在栈上。
  • 内存地址不能大于 0x00007FFFFFFFFFFF,6 个字节长度,否则会抛出异常。

堆栈操作

缓冲区溢出常见的几种操作

压栈push

出栈pop

调用cal

离开leave

返回ret

其他

  1. Top/Peek: 查看栈顶元素而不移除它。

  2. IsEmpty: 检查栈是否为空。

  3. Size: 获取栈中元素的数量。

  4. Insert (添加): 向堆中插入一个新元素。

  5. Maximum/Minimum (取最大/最小值): 返回最大堆中的最大值或最小堆中的最小值(通常是根节点)。

  6. Extract-Max/Extract-Min (提取最大/最小值): 移除并返回最大堆中的最大值或最小堆中的最小值。

  7. Increase-Key (增加节点的值): 将某个节点的值增加到一个较大的值。(最大堆中使用)

  8. Decrease-Key (减小节点的值): 将某个节点的值减小到一个较小的值。(最小堆中使用)

  9. Heapify (堆化): 将一个不满足堆属性的二叉树调整为一个堆。

  10. Build-Heap (建堆): 从无序的输入数组构建一个新的堆。

栈溢出

栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致与其相邻的栈中的变量的值被改变。这种问题是一种特定的缓冲区溢出漏洞,类似的还有堆溢出,bss 段溢出等溢出方式。栈溢出漏洞轻则可以使程序崩溃,重则可以使攻击者控制程序执行流程。此外,我们也不难发现,发生栈溢出的基本前提是

  • 程序必须向栈上写入数据。
  • 写入的数据大小没有被良好地控制。

想要覆盖程序返回的地址为可控地址,需要确保这个地址所在的具有可执行权限。如何判断呢?这里可以先了解一下gcc编译器以及PIE(Position Independent Executable),地址空间随机化(ASLR)机制,也是编译器自带的能力,但是版本不同默认配置不同;

关于gcc编译参数的相关了解参考:

elf文件分析–checksec–检查gcc安全编译配置

请添加图片描述

现在新版的很多编译器都是默认带上安全配置,除了上面的PIE,还有NX保护等,随着这些保护的开启对应以往直接向栈或者堆上直接注入代码的方式就不能实现了,后面主要思路就是ROP(Return Oriented Programming)。

寻找危险函数

通过寻找危险函数,我们快速确定程序是否可能有栈溢出,以及有的话,栈溢出的位置在哪里。常见的危险函数如下

  • 输入
    • gets,直接读取一行,忽略’\x00’
    • scanf
    • vscanf
  • 输出
    • sprintf
  • 字符串
    • strcpy,字符串复制,遇到’\x00’停止
    • strcat,字符串拼接,遇到’\x00’停止
    • bcopy

确定填充长度

这一部分主要是计算我们所要操作的地址与我们所要覆盖的地址的距离。常见的操作方法就是打开 IDA,根据其给定的地址计算偏移。一般变量会有以下几种索引模式

  • 相对于栈基地址的的索引,可以直接通过查看 EBP 相对偏移获得
  • 相对应栈顶指针的索引,一般需要进行调试,之后还是会转换到第一种类型。
  • 直接地址索引,就相当于直接给定了地址。

一般来说,我们会有如下的覆盖需求

  • 覆盖函数返回地址,这时候就是直接看 EBP 即可。
  • 覆盖栈上某个变量的内容,这时候就需要更加精细的计算了。
  • 覆盖 bss 段某个变量的内容
  • 根据现实执行情况,覆盖特定的变量或地址的内容。

参考

C语言函数调用栈(一) - clover_toeic - 博客园 (cnblogs.com)

C语言函数调用栈(二) - clover_toeic - 博客园 (cnblogs.com)

栈溢出原理 - CTF Wiki (ctf-wiki.org)

漏洞悬赏计划:涂鸦智能安全响应中心(https://src.tuya.com)欢迎白帽子来探索。

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

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

相关文章

【JavaScript】JS对象和JSON

目录 一、创建JS对象 方式一:new Object() 方式二:{属性名:属性值,...,..., 方法名:function(){ } } 二、JSON格式 JSON格式语法: JSON与Java对象互转: 三、JS常见对象 3.1数组对象API 3.2 其它对象API 一、创建JS对象 方式一:new…

创新前沿:Web3如何颠覆传统计算机模式

随着Web3技术的快速发展,传统的计算机模式正面临着前所未有的挑战和改变。本文将深入探讨Web3技术的定义、原理以及它如何颠覆传统计算机模式,以及对全球科技发展的潜在影响。 1. 引言:Web3技术的兴起与背景 Web3不仅仅是技术创新的一种&…

OpenAI 开启买买买模式:接连收购 Rockset 与 Multi,科技巨头创新布局

引言 最近,OpenAI 在科技领域引起了广泛关注,通过接连收购两家初创公司 Rockset 和 Multi,开启了所谓的“买买买模式”。这一战略举措不仅展现了 OpenAI 对于技术发展的深远布局,也预示着未来更多创新产品的推出。本文将详细探讨…

Dataease安装,配置Jenkins自动部署

Dataease安装,配置Jenkins自动部署 一.安装Dataease 安装前准备:1.Ubuntu20.04 LTS国内源安装指定版本Docker 2.docker-compose安装 下载离线安装的安装包,下载地址:https://community.fit2cloud.com/#/download/dataease/v1-…

检测故障电容器

去耦电容与旁路电容 “去耦电容”和“旁路电容”这两个术语经常互换使用,它们的功能重叠,容易造成混淆。实际上,它们的用途相似,但在电路中的应用可能会影响术语。 去耦电容 功能:去耦电容器主要用于通过为交流信号…

【人工智能学习之图像操作(一)】

【人工智能学习之图像操作(一)】 图像读写创建图片并保存视频读取色彩空间与转换色彩空间的转换通道分离理解HSV基本图形绘制 阀值操作OTSU二值化简单阀值自适应阀值 图像读写 图像的读取、显示与保存 import cv2 img cv2.imread(r"1.jpg")…

Wp-scan一键扫描wordpress网页(KALI工具系列三十)

目录 1、KALI LINUX 简介 2、Wp-scan工具简介 3、信息收集 3.1 目标IP(服务器) 3.2kali的IP 4、操作实例 4.1 基本扫描 4.2 扫描已知漏洞 4.3 扫描目标主题 4.4 列出用户 4.5 输出扫描文件 4.6 输出详细结果 5、总结 1、KALI LINUX 简介 Kali Linux 是一…

海外仓一件代发效率提升方案:拣货区规划策略

作为海外仓的核心业务,一件代发处理的效率和准确性,可以说直接影响了海外仓的经济效益。今天我们就会针对大家都比较头疼的一件代发效率问题,给大家分享一些实用建议。 提升一件代发效率要考虑的3个关键要素 对以一件代发为主要业务的海外仓…

【机器学习】机器学习重要方法——迁移学习:理论、方法与实践

文章目录 迁移学习:理论、方法与实践引言第一章 迁移学习的基本概念1.1 什么是迁移学习1.2 迁移学习的类型1.3 迁移学习的优势 第二章 迁移学习的核心方法2.1 特征重用(Feature Reuse)2.2 微调(Fine-Tuning)2.3 领域适…

C++身份证ocr识别、身份证二要素核验接口状态码返回

互联网时代,对个人进行身份证实名认证相信大家都不陌生,那么,对于实名认证功能是如何实现的大家有所了解么?对于开发人员而言,身份证实名认证接口返回的状态码又都代表着什么意思呢?今天,跟着翔…

2024 年最新 Python 基于火山引擎豆包大模型搭建 QQ 机器人详细教程(更新中)

豆包大模型概述 火山引擎官网:https://www.volcengine.com/ 字节跳动推出的自研大模型。通过字节跳动内部50业务场景实践验证,每日千亿级tokens大使用量持续打磨,提供多模态能力,以优质模型效果为企业打造丰富的业务体验。 模型…

【Python机器学习】自动化特征选择——基于模型的特征选择

基于模型的特征选择使用一个监督机器学习模型来判断每个特征的重要性,并且仅保留最重要的特征。用于特征学习的监督模型不需要与用于最终建模的模型相同。特征选择模型需要为每个特征提供某种重要性度量,以便用这个度量对特征进行排序。决策树和基于决策…

Potato(土豆)一款轻量级的开源文本标注工具

项目介绍: Potato 是一款轻量级、可移植的Web文本标注工具,被EMNLP 2022 DEMO赛道接受。它旨在帮助用户快速地从零开始创建和部署各种文本标注任务,无需复杂的编程或网页设计。只需简单配置,团队即可在几分钟内启动并运行标注项目…

互联网寒冬VS基建饱和:计算机专业会重蹈土木工程的覆辙吗?

随着高考落幕,考生和家长们开始着手专业选择与志愿填报,"热门"与"冷门"专业的话题引起了广泛关注。而计算机专业无疑是最受瞩目的专业领域之一。 在过去的十几年里,计算机专业以其出色的就业率和薪酬水平,一…

LAMP架构的源码编译环境下部署Discuz论坛

一、LAMP架构 LAMP架构是一种常见的用于构建动态网站的技术栈 组成功能Linux(操作系统)LAMP 架构的基础,用于托管 Web 服务器和应用程序Apache(Web服务器)接收和处理客户端请求,并将静态和动态内容发送给…

AMEYA360代理:村田电子使用小型振动传感器件,实现设备状态预知检测

株式会社村田制作所近日完成了贴片型振动传感器件“PKGM-200D-R”的商品化。该新产品已开始批量生产供应。 以往FA行业实施的是计划性维护和事后维护,近年来预测性维护逐步受到关注。预测性维护使用各类传感器信息等预测可能发生故障的时间,以便事先采取…

ABAP编程中的参数传递:使用EXPORT/IMPORT与SPA/GPA参数

在ABAP编程中,有效地在程序之间传递数据是实现功能的关键。本文档将介绍两种常用的数据传递方法:EXPORT/IMPORT和SPA/GPA参数,并提供实际示例。 1. 使用EXPORT/IMPORT数据(ABAP/4内存) EXPORT/IMPORT语句允许程序在ABA…

重生之我要学后端0--HTTP协议和RESTful APIs

http和RESTful APIs HTTP协议RESTful APIs设计RESTful API设计实例 HTTP协议 HTTP(超文本传输协议)是用于分布式、协作式和超媒体信息系统的应用层协议。它是网页数据通讯的基础。工作原理简述如下: 客户端请求(Request&#xf…

Jmeter,badboy学习

1、注意Jmeter与jdk之间的版本对应 2、Jmeter的作用: jmeter可以做接口测试和压力测试。其中接口测试的简单操作包括做http脚本(发get/post请求、加cookie、加header、加权限认证、上传文件)、做webservice脚本、参数化、断言、关联&#x…

500多个专业怎么选择,高考填报志愿为什么难?

查成绩,报志愿,选专业,考出怎样的成绩,可选择的学校有哪些?所以很多人会比较慎重,可是慎重也不代表选择就容易。 目前来看,可选择的专业高达500多个,甚至超过500多个,文…