缓冲区溢出
本文作者:杉木@涂鸦智能安全实验室
前置知识点
栈
栈(Stack)是计算机中的一种数据结构,用于存储临时数据。它的特点是后入先出(LIFO),只能在栈顶添加或删除数据。在程序中,栈被用于存储函数调用时的临时变量,以及用于控制程序执行流程的返回地址。
堆
堆(Heap)是计算机中的一种数据结构,它是程序在运行时动态分配的内存。与栈相比,堆的结构并无特定的规则,可以随时在堆上分配或释放内存。在程序中,堆通常被用于存储需要在函数调用之间持久存在的数据。
寄存器
寄存器的类型
寄存器的类型和用途各不相同,它们包括但不限于:
- 通用寄存器:可以用来存储数值或内存地址,并在各种操作中使用。
- 专用寄存器:对操作系统或CPU操作有特殊影响的寄存器。
- 数据寄存器:存储数值数据,用于算术、逻辑等操作。
- 地址寄存器:存储内存地址,允许CPU访问和操作内存中的数据。
- 程序计数器(PC):存储即将执行的下一条指令的地址。
- 基址寄存器(Base Register):与索引寄存器一起用于数组和字符串操作。
- 堆栈指针(Stack Pointer):指向当前顶部的堆栈的地址。
- 指令寄存器(Instruction Register):存储当前被执行的指令。
- 状态寄存器/标志寄存器(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
其他
-
Top/Peek: 查看栈顶元素而不移除它。
-
IsEmpty: 检查栈是否为空。
-
Size: 获取栈中元素的数量。
-
Insert (添加): 向堆中插入一个新元素。
-
Maximum/Minimum (取最大/最小值): 返回最大堆中的最大值或最小堆中的最小值(通常是根节点)。
-
Extract-Max/Extract-Min (提取最大/最小值): 移除并返回最大堆中的最大值或最小堆中的最小值。
-
Increase-Key (增加节点的值): 将某个节点的值增加到一个较大的值。(最大堆中使用)
-
Decrease-Key (减小节点的值): 将某个节点的值减小到一个较小的值。(最小堆中使用)
-
Heapify (堆化): 将一个不满足堆属性的二叉树调整为一个堆。
-
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)欢迎白帽子来探索。
相关文章:
缓冲区溢出
本文作者:杉木涂鸦智能安全实验室 前置知识点 栈 栈(Stack)是计算机中的一种数据结构,用于存储临时数据。它的特点是后入先出(LIFO),只能在栈顶添加或删除数据。在程序中,栈被用于…...
step7:“模拟量界面”逻辑
文章目录 文章介绍效果图AnalogPage.qml结构图调用 SerialPortHandler.sendData(message); serialporthandler.cpp 文章介绍 之前的6步实现了案例MF的界面设计和串口界面的逻辑设计,本文将实现模拟量界面的逻辑设计 新增功能: 1)弹出提示框 …...
Arduino - 继电器
Arduino - 继电器 In a previous tutorial, we have learned how to turn on/off an LED. In this tutorial, we are going to learn how to turn on/off some kind of devices that use the high voltage power supply(such as a light bulb, fan, electromagnetic lock, lin…...
状态压缩DP——AcWing 327. 玉米田
状态压缩DP 定义 状态压缩 DP 是一种通过二进制压缩状态的动态规划算法。它通过使用位运算来加速状态的转移和计算,从而提高算法的效率。 注意事项 数据范围:状态压缩 DP 通常适用于数据范围较小的问题,因为它需要使用二进制来表示状态&a…...
kafka(二)安装部署(2)windows
目录 一、前提 1、jdk 2、Zookeeper 2.1、解压 2.2、创建data文件夹 2.3、配置文件 2.4、添加环境变量 2.5、启动zk:zkServer 2.6、客户端 3、Scala 3.1、下载安装 3.2、配置环境变量 3.3、验证是否安装成功 二、kafka下载安装 1、下载 2、安装 2.1…...
aliplayer Server returned 403 Forbidden (access denied)
最近在接入阿里云播放器的sdk,项目的播放地址是m3u8的,h265的url 输入播放源以后播放报错,提示403,拒绝访问,起初以为是crt路径问题和key的问题,然后检查了以后没问题,后来又看了一下是不是白名单的问题,但是项目资源没通过阿里云平台存储 AVPUrlSource *source [[AVPUrlSou…...
单例模式(下)
文章目录 文章介绍步骤安排及单例讲解step1:注册单例类型(main.cpp)step2:定义类和私有构造函数(keyboardinputmanager.h)step3:(keyboardinputmanager.cpp)step4:在qml中…...
合约期VS优惠期,搞明白他们的区别才能避免很多坑!
在购买流量卡时,相信大家也都发现了,市面上的不少套餐都是有合约期和优惠期的,尤其是联通和移动,那么,什么是合约期?什么又是优惠期呢? 其实,目前很多在网上办理的大流量卡都是有…...
函数式反应式编程(FRP)在Scala中的实践与探索
函数式反应式编程(Functional Reactive Programming,简称FRP)是一种编程范式,它结合了函数式编程(Functional Programming,FP)的声明式特性和反应式编程(Reactive Programming&#…...
NGINX配置web文件服务
一、需求描述 系统需要提供文件(pdf、图片)等上传后支持预览功能。 二、实现方式 2.1 文件权限配置 chmod arwx -R public/chmod 是更改文件权限的命令。-R 是递归选项,表示更改目录及其所有子目录和文件的权限。arwx 是权限设置…...
deepspeed docker集群实现多机多卡训练----问题记录及解决方案资源汇总
. Docker中实现Deepspeed多机多卡训练 【掘金-雨田君的记事本】docker容器中deepspeed多机多卡集群分布式训练大模型 . 问题记录及解决方案资源汇总 问题1:deepspeed socketStartConnect: Connect to 172.18.0.3<54379> failed : Software caused connectio…...
恢复 IntelliJ IDEA 中消失的菜单栏
要恢复 IntelliJ IDEA 中消失的菜单栏,可以按照以下简单步骤操作: 使用快捷键打开搜索:首先,双击 Shift 键打开全局搜索对话框。 搜索“Menu”:在搜索框中输入 menu,然后从搜索结果中选择与“Main Menu”相…...
漏洞利用开发基础学习记录
文章目录 简介Win32缓冲区溢出内容难点 SEH 溢出内容难点 Egg Hunters内容难点 Unicode 溢出内容难点 x86-64 缓冲区溢出内容难点 参考资料 简介 本文基于ERC.Xdbg漏洞分析文章进行初步归纳整理,主要有Win32 缓冲区溢出、SEH 溢出、Egg Hunters、Unicode 溢出、x86…...
云通SIPX,您的码号资源智能调度专家!
在数字化转型的浪潮中,号码资源作为企业与客户沟通的重要桥梁,其管理效率直接关系到企业运营的成败。随着运营商对号码资源管理的规范化和精细化,企业对高效、智能的号码资源管理需求日益增长,以实现对外呼叫的降本增效。 一、什么…...
04-Mysql 索引,事务
MySQL 索引介绍 索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址。在数据十分庞大的时候,索引可以大大加快查询的速度。这是因为使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行…...
U盘提示格式化怎么搞定?本文有5种方法(内含教程)
U盘提示格式化是一种常见故障,即:当U盘插入电脑后,电脑上弹出对话框,提示该U盘需要格式化才能使用。 接触不良、文件系统损坏、热插拔、感染病毒、芯片损坏等原因都可能导致U盘出现此故障。这时点击“格式化”,大概率会…...
day02-登录模块-主页鉴权
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1.分析登录流程1.1传统思路是登录校验通过之后,直接调用接口,获取token之后,跳转到主页1.2vue-element-admin模板的登录思路&…...
git rebase的使用
没有排版,但是干货 因为项目要求,所以使用rebase指令 我使用的是rebase 的分支变基的功能 情景描述: 一共有两个分支:master owner 我在owner分枝上开发,有好多次commit master上也有同事在正常commit, …...
LICEcap-开源GIF 屏幕录制工具
LICEcap-开源GIF 屏幕录制工具 开源GIF 屏幕录制工具 下载可以访问:https://www.cockos.com/licecap/ 点击Record,开始录制 点击Stop,停止录制 点击Record,进入该页面 display in animation(在动画中显示) …...
【Java Web】会话管理
目录 一、为什么需要会话管理? 二、会话管理机制 三、Cookie概述 四、HttpSession概述 4.1 HttpSession时效性 一、为什么需要会话管理? HTTP协议在设计之初就是无状态的,所谓无状态就是在浏览器和服务器之间的通信过程中,服务器并…...
RestTemplate修改默认转换器,使用FastJsonConverter
问题描述: 在使用RestTemplate发送POST请求时,发现发送的数据并未按配置的JSONField转换,导致服务方一直收不到参数 排查过程: 将itemList改成Items传输即可 原因分析: RestTemplate有默认的转换器,所以…...
什么是div移动指令?如何用vue自定义指令实现?
目录 一、Vue.js框架介绍二、vue自定义指令directive三、什么是div移动指令四、使用vue自定义指令directive写一个div移动指令 一、Vue.js框架介绍 Vue.js是一个用于构建用户界面的渐进式JavaScript框架。它设计得非常灵活,可以轻松地被集成到现有的项目中…...
Golang | Leetcode Golang题解之第187题重复的DNA序列
题目: 题解: const L 10 var bin map[byte]int{A: 0, C: 1, G: 2, T: 3}func findRepeatedDnaSequences(s string) (ans []string) {n : len(s)if n < L {return}x : 0for _, ch : range s[:L-1] {x x<<2 | bin[byte(ch)]}cnt : map[int]in…...
智能猫砂盆到底是不是智商税?解救上班族双手的测评合集来了
不得不说,像我这样的上班族真的是很需要一个智能猫砂盆了。普通的猫砂盆一天就要打扫3次,遇到很能拉的猫咪的时候,就不止是三次那么简单了。如果有个产品能帮我解决这个问题,让我能放心外出,那又何乐而不为呢ÿ…...
java 数据新增、更新、删除监听,并记录日志或其他业务
数据新增、更新、删除监听,并记录日志或其他业务 1.使用场景 日志记录、KPI考核(业务进行到某个阶段,对人员的考核)等等 实体监听器 实体增加注解 EntityListeners({KpiOrderCounter.class}) /*** 订单管理考核** author sul…...
developer.android.com在国内无法正常访问解决方法
将android.com替换为android.google.cn...
大学物理(下)笔记
摘录来自笔记网站的笔记。笔记网站详见https://onford.github.io/Notes/。 大学物理(下)笔记 部分常用物理常量的计算值 C h a p t e r 9 Chapter9 Chapter9 恒定磁场 毕奥-萨伐尔定律 磁场和电场在很多性质上是有共性的,很多时候可以拿它…...
Mind+在线图形编程软件(Sractch类软件)
Scratch作为图形编程软件,可以为小朋友学习编程提供很好的入门,是初次接触编程的小朋友的首选开发软件。这里介绍的Mind软件与Sractch用法几乎完全一致,并且可以提供在线免安装版本使用,浏览器直接打开网址: ide.mindp…...
数智化招采供应链平台七大优点
在当今快速发展的商业环境中,技术更新风起云涌、数字化转型不断加快,产业链供应链竞争日趋激烈。企业必须不断提升产业链供应链现代化水平,建设畅通、韧性、竞争力强的产业链供应链,因此招采供应链平台的需求日益迫切。 为满足企…...
Java面试题:对比HTTP的GET和POST方法,并讨论它们的使用场景
HTTP的GET和POST方法是用于在客户端和服务器之间交换数据的两种基本请求方法。它们有不同的特性和使用场景。 GET方法 特性 数据在URL中传输:GET请求的数据附加在URL的末尾,通过查询字符串传输。数据长度限制:由于浏览器和服务器对URL长度…...
wordpress卢松松2019/关键词提取工具
安转插件:案例格式化HTML代码,需要安装插件,具体安装步骤如下: 1、打开菜单->首选项->插件控制,输入 install package 2、等待程序进入插件管理功能,再输入插件名称:TAG 3、点击安装插件。…...
动软代码生成器 做网站/seo最新教程
为什么80%的码农都做不了架构师?>>> 所谓的文章修订版就是你每次修改一次文章,它都会自动帮你保存修改之前的文章版本,专业术语叫做版本控制,这样保证了在误修改的情况下可以还原之前的内容,这种功能对我们…...
牙科 网站建设方案/发帖推广平台
背景 记得前段时间,同事说他们测试环境的服务器cpu使用率一直处于100%,本地又没有什么接口调用,为什么会这样?cpu使用率居高不下,自然是有某些线程一直占用着cpu资源,那又如何查看占用cpu较高的线程&#x…...
男女在一起做恶心的事网站/seo标签怎么优化
2019独角兽企业重金招聘Python工程师标准>>> Google Chrome目前已经是性能最佳,对HTML5/CSS3等网页新技术支持最好的浏览器了,所以我浏览网站,习惯性地总是用Chrome。 最近一段时间,我经常用Chrome浏览国外教学视频网…...
wordpress 获取分类文章/seo推广的常见目的有
http://www.cnblogs.com/newpanderking/archive/2011/10/03/2198648.html 讲得很详细。。。我没明白。...
深圳网站建设怎么办/网站要怎么创建
嗨, 欢迎来到课程的第一部分。 并行计算和Python入门。 在本节中, 我们将讨论并行计算和内存架构。 我们还将关注内存组织和并行编程模型。 接下来, 我们将看到如何设计并行程序, 并评估并行程序的性能。 此外, 我们将介绍Python。 并且我们将与流程一起工作, 并与他们一起调节…...