栈溢出原理

2023-11-01

栈溢出原理


前言:栈

  1. 栈是一种LIFO的数据结构。
  2. 应用程序有一到多个用户态栈。
  3. 栈自底向上增长,由指令PUSH和POP引起其动态变化。
  4. 局部变量布局在栈中。
  5. 调用函数时参数由栈传递,返回地址也存储于栈中。
  6. 函数调用上下文与局部变量共同组成了栈帧——Stack Frame.
    栈帧 = 局部变量 + 函数调用上下文
    栈帧实际上只是一个通俗的说法,关于栈帧的上下界历来有两种说法,一曰以EBP和ESP之间的栈空间视为栈帧,这也是主流说法;一曰以调用参数和ESP之间的栈空间视为栈帧,我个人更倾向于这种说法,因为它便于理解。

函数调用过程中栈的变化函数调用过程中栈的变化

一、栈溢出原理

栈溢出是缓冲区溢出中的一种。函数的局部变量通常保存在栈上。如果这些缓冲区发生溢出,就是栈溢出。最经典的栈溢出利用方式是覆盖函数的返回地址,以达到劫持程序控制流的目的。

x86构架中一般使用指令call调用一个函数,并使用指令ret返回。CPU在执行call指令时,会先将当前call指令的下一条指令的地址入栈,再跳转到被调用函数。当被调用函数需要返回时,只需要执行ret指令。CPU会出栈栈顶的地址并赋值给EIP寄存器。这个用来告诉被调用函数自己应该返回到调用函数什么位置的地址被称为返回地址。理想情况下,取出的地址就是之前调用call存入的地址。这样程序可以返回到父函数继续执行了。编译器会始终保证即使子函数使用了栈并修改了栈顶的位置,也会在函数返回前将栈顶恢复到刚进入函数时候的状态,从而保证取到的返回地址不会出错。

二、栈保护技术

栈溢出利用难度很低,危害巨大。为了缓解栈溢出带来的日益严重的安全问题,编译器开发者们引入Canary机制来检测栈溢出攻击。

Canary中文译为金丝雀。以前矿工进入矿井时都会随身带一只金丝雀,通过观察金丝雀的状态来判断氧气浓度等情况。Canary保护的机制与此类似,通过在栈保存rbp的位置前插入一段随机数,这样如果攻击者利用栈溢出漏洞覆盖返回地址,也会把Canary一起覆盖。编译器会在函数ret指令前添加一段会检查Canary的值是否被改写的代码。如果被改写,则直接抛出异常,中断程序,从而阻止攻击发生

三、常发生栈溢出的危险函数

  1. 输入:gets(),直接读取一行,到换行符’\n’为止,同时’\n’被转换为’\x00’;scanf(),格式化字符串中的%s不会检查长度;vscanf(),同上。
  2. 输出:sprintf(),将格式化后的内容写入缓冲区中,但是不检查缓冲区长度
  3. 字符串:strcpy(),遇到’\x00’停止,不会检查长度,经常容易出现单字节写0(off by one)溢出;strcat(),同上。

四、可利用的栈溢出覆盖位置

可利用的栈溢出覆盖位置通常有3种:

  1. 覆盖函数返回地址,之前的例子都是通过覆盖返回地址控制程序。
  2. 覆盖栈上所保存的BP寄存器的值。函数被调用时会先保存栈现场,返回时再恢复,具体操作如下(以x64程序为例)。调用时:
    在这里插入图片描述

返回时:如果栈上的BP值被覆盖,那么函数返回后,主调函数的BP值会被改变,主调函数返回指行ret时,SP不会指向原来的返回地址位置,而是被修改后的BP位置。
3. 根据现实执行情况,覆盖特定的变量或地址的内容,可能导致一些逻辑漏洞的出现。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

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

栈溢出原理 的相关文章

  • ctf中pwn题目总结

    pwntools工具使用 1 安装 pip install pwntools xff08 python2 xff09 pip3 install pwntools xff08 python3 xff09 2 使用 Context设置 cont
  • 攻防世界PWN新手练习区——cgpwn2

    攻防世界PWN新手练习区 cgpwn2 首先检查文件的有哪些保护 checksec cgpwn2 32位程序 用IDA反编译文件 main函数中只有hello函数 点击查看 整个函数看起来是在进行某种算法 但关键点在于return gets
  • 攻防世界-pwn when_did_you_born(栈覆盖)

    0x01 拿到文件之后 先检查文件的基本信息 文件信息 64bit elf可执行文件 无PIE保护 0x02 执行文件 文件之中有两个输入 第一个输入有回显 0x03 IDA静态分析 可以看出获取flag需要用到v5的值 首先需要v5不等于
  • 汇编语言(王爽)第四版学习1

    第一章 机器语言 0 1 简单语句 mov ax bx 汇编语言组成 1 汇编指令 机器码的助记符 有对应的机器码 2 伪指令 没有对应的机器码 由编译器执行 计算机并不执行 3 其他符号 如 等 由编译器识别 没有对应的机器码 存储器 内
  • CTFshow-pwn入门-前置基础pwn29-pwn31

    什么是PIE 由于ASLR是一种操作系统层面的技术 而二进制程序本身是不支持随机化加载的 便出现了一些绕过方法 例如ret2plt GOT劫持 地址爆破等 于是 人们于2003年引入了位置无关可执行文件 Position Independe
  • pwn 入门基础

    web狗的pwn生之路 系列文章目录 第一章 pwn 入门基础 第二章 pwn 栈题基础 待更新 文章目录 web狗的pwn生之路 系列文章目录 一 汇编基础 重点 笔记 二 Linux 基础 重点 笔记 三 调用约定 重点 笔记 四 EL
  • 攻防世界 pwn forgot

    下面记录一下我在做攻防世界的pwn练习题中的forgot题目的过程 这个题目现在还是有些疑惑的 首先我们看一下题目的安全机制 然后IDA看一下主函数 int cdecl main size t v0 ebx char v2 32 esp 1
  • PWN学习-ADworld刷题

    前言 搁置了一段时间没更博 经历了考试还有一些其他事 决心好好去学pwn 学习的方法打算是按照看视频课加刷题加查找资料来学习 先把新手题都刷了一遍 都是很入门的题目 没啥好提的 收获也少 然后去刷进阶的题 但是目前还没有遇到堆的题目 视频课
  • 栈溢出原理

    栈溢出原理 文章目录 栈溢出原理 前言 栈 一 栈溢出原理 二 栈保护技术 三 常发生栈溢出的危险函数 四 可利用的栈溢出覆盖位置 总结 前言 栈 栈是一种LIFO的数据结构 应用程序有一到多个用户态栈 栈自底向上增长 由指令PUSH和PO
  • 1.pwn基础总结

    基本概念 exploit 用于攻击的脚本与方案 通常缩写为exp payload 攻击载荷 是的目标进程被劫持控制流的数据 shellcode 调用攻击目标的shell的代码 打开目标的shell 获取目标控制权 pwn解题基本流程 che
  • 二进制安全虚拟机Protostar靶场(2)基础知识讲解,栈溢出覆盖变量 Stack One,Stack Two

    前言 Protostar靶场的安装和一些二进制安全的基础介绍在前文已经介绍过了 这里是文章链接 https blog csdn net qq 45894840 article details 129490504 spm 1001 2014
  • 36D杯CTF——mengxinstack

    记录一下36D的mengxinstack题目 下载题目 checksec下分析 开启了很多保护 有canary 64位 IDA分析 知道这个程序先执行了一次read 再把read进去的东西print出来 再read 两次read都会造成栈溢
  • bukku ctf(刷题2)

    bugku ctf 抄错的字符 简单取证1 这是一张单纯的图片 计算器 GET POST 矛盾 alert 你必须让他停下 signin Easy Re 游戏过关 Easy vb 树木的小秘密 Timer 阿里CTF 抄错的字符 Crypt
  • pwn手记录题2

    fastbin reverse into tcache 2 34 本题所使用的libc版本为2 34 最新版 libc2 34版本已经没有了所谓的hook函数 甚至exit hook 实际为某个函数指针 也已经不能够使用 能够利用的手法已经
  • 用gdb.attach()在gdb下断点但没停下的情况及解决办法

    在python中 如果导入了pwntools 就可以使用里面的gdb attach io 的命令来下断点 但是这一次鼠鼠遇到了一个情况就是下了断点 但是仍然无法在断点处开始运行 奇奇怪怪 这是我的攻击脚本 我们运行一下 可以看到其实已经运行
  • 安卓pwn - De1taCTF(BroadcastTest)

    BroadcastTest 背景 逆向APK可知程序中仅有MainActivity Message和三个Receiver类 前者实现了一个Parcelable类 后三个则是广播 其中Receiver1是exported的 接收并向Recei
  • 再探ROP(下)

    文章目录 0x01 概述 0x02 ret2reg 2 1 起因 2 2 原理 0x03 brop详解 3 1 概述 3 2 逆向思维切入 1 搭建环境 2 溢出长度和爆破canary 3 如何getshell 4 寻找直接条件 5 寻找间
  • pwnable.tw - start

    首先安装 pwntools 在执行pip install upgrade pwntools时出错 cannot import name main 要修改 usr bin pip from pip import main 为 from pip
  • pwn 做题记录 2.8 adworld hello_pwn

    2022 2 8 今天其实没有起的很早 中午去玩3d打印机又花了很多时间 但是还是有一点点进展 首先解决了pwndbg的问题 其实别的blog本来说的就很清楚 找到gdbinit这个文件之后自己编辑就行了 但是之前操作的时候没有按照vim的
  • 2.[BUU]rip

    1 检查文件 checksec 一下 查看之后发现是64位 直接放入IDA64进行反编译 2 IDA反编译 进行分析 发现是gets 函数可以造成栈溢出 从而可以覆盖栈上的内容 想法 通过gets函数 栈溢出 来篡改栈上的内容指令 从而达到

随机推荐

  • vue_前后端分离-增删改操作

    增加操作和修改操作 两个操作放一个页面进行操作 使用插槽 scope row 的方式获取列表中的每一行数据
  • 在Android上实现SPI通信之(1)------在Ubuntu12.04环境下编译android源码

    作为一个Android应用开发者 突然接到一下需求 需要在应用层传递一个信号到外设 传递方式用SPI通信 没有做过 甚是头大 遇到了好多坑 所以记录成册 希望对后来的开发者 有那么一点点的帮助 如果有不正确的地方 还请指正 目前我实现的大体
  • 数据结构-图篇

    数据结构 图篇 内容 思维导图 基于教材 错题复盘 计算题 基于习题解析 课后习题 1 思维导图 2 错题复盘 计算题 1 具有n个顶点的有向图最多有 B 条边 A n B n n 1 C n n 1 D n 2 解析 对于有n个顶点的有向
  • 机器学习:python实践 回归项目实例 学习记录

    导入类库 import numpy as np import pandas from numpy import arange from matplotlib import pyplot from pandas import read csv
  • 微信小程序原生开发学习01

    文章目录 一 起步 1 注册一个小程序账号 2 下载安装开发者工具 3 新建小程序项目 二 小程序配置 1 全局配置 1 小程序默认启动页 2 页面路径列表 3 分包
  • 字符串的数字部分加1操作

    字符串如通天塔001 10002 Test990 public static String addOne4Str String str if str null int fIndex 1 for int i 0 i lt str length
  • 2022搭建企业级数据治理体系

    数据治理是企业数据建设必不可少的一个环节 好的数据治理体系可以盘活整条数据链路 最大化保障企业数据的采集 存储 计算和使用过程的可控和可追溯 如何构建企业数据治理体系 企业数据治理过程需要注意哪些问题 总体而言 不能一口一个胖子 路要一步一
  • Pycharm乱码解决大全

    一 运行项目时控制台乱码 最直观的方法就是改控制台的默认编码方式 如果不行 就在Settings的Editor里点击FileEncoding 在下图中三个位置修改编码一致 一般为UTF 8或者GBK 最后Apply并确认后重新运行项目即可
  • 测试用例具体设计方法

    目录 一 根据需求写测试用例 二 测试用例具体的设计方法 1 等价类 2 边界值 3 因果图法 4 正交法 5 场景法 6 错误猜测法 一 根据需求写测试用例 1 首先要保证需求的合理性和正确性 要先验证需求 2 分析需求 把大需求细化成小
  • 机器如何识别花的种类

    惊蛰已过 一声春雷 大地开始解冻 条件允许的话 出去晒晒太阳 看看风景 赏赏花 也可以在央视直播云赏花 十多个机位展示了全国各地不同地区的美丽风景 形色 看到好看的花 但是叫不上名字怎么办 这里推荐一下 形色 一款小众的识花应用 带你遇见全
  • 使用arcpy导出要素类和删除要素类中的要素数据

    需求 目的是在指定的GDB数据库中 将要素数据集SourcePolygon下的北京图层中的Layer字段值等于 KZ 控制指标 的记录先导出到新创建的TempPolygon下 导出的图层名为 ControlIndex 然后再将北京图层中的L
  • java知识点——case

    A continue statement can be used only in a loop continue语句只能在循环中使用 A break statement can t be used only in a loop break语
  • 【计算机视觉

    文章目录 一 检测相关 9篇 1 1 Federated Ensemble YOLOv5 A Better Generalized Object Detection Algorithm 1 2 Zero shot Nuclei Detect
  • 使用WinDbg Preview 查看Windows 10蓝屏Dump文件

    从应用商店安装WinDbg Preview 1 登陆应用商店 搜索WinDbg Preview 2 选择获取 我的Windows 10 系统已经安装过了 3 在启动菜单可以找到WinDbg Preview 4 找到蓝屏文件 并选择使用Win
  • 【Github】错误解决:OpenSSL SSL_read: Connection was reset, errno 10054

    git 报错信息 OpenSSL SSL read Connection was reset errno 10054 Git 中 push 或者 pull 报错 OpenSSL SSL read Connection was reset e
  • arthas的trace、watch、tt、profiler命令的使用

    arthas的trace watch tt profiler命令的使用
  • 通过C语言实现小数整数求原码,反码,补码

    通过C语言实现小数 整数求原码 反码 补码 判断输入的值是整数还是小数 是正是负 求纯整数不含符号的原码 求纯小数不含符号的原码 完善整个原码 符号 小数 整数合在一起 将求原码的函数封装在一个函数里 求反码的函数 求补码的函数 main函
  • Linux-线程学习(上)

    本文导航 内容 所占百分比 线程概念 40 线程与进程区别与联系 20 线程优缺点 10 线程控制 创建 终止 等待 30 线程的概念 谈到线程 我们先从进程说起 我们写的程序从硬盘加载到内存开始运行时 进程就产生了 也就是操作系统开始为这
  • 水仙花数(Java实现)

    春天是鲜花的季节 水仙花就是其中最迷人的代表 数学上有个水仙花数 他是这样定义的 水仙花数 是指一个三位数 它的各位数字的立方和等于其本身 比如 153 1 3 5 3 3 3 现在要求输出所有在m和n范围内的水仙花数 import jav
  • 栈溢出原理

    栈溢出原理 文章目录 栈溢出原理 前言 栈 一 栈溢出原理 二 栈保护技术 三 常发生栈溢出的危险函数 四 可利用的栈溢出覆盖位置 总结 前言 栈 栈是一种LIFO的数据结构 应用程序有一到多个用户态栈 栈自底向上增长 由指令PUSH和PO