栈溢出基本原理的简单讲解

2023-11-01

栈溢出基本原理的简单讲解

(新手上路,大牛还请自行跳过,不足之处,欢迎批评指正)

一 、预备知识:

  1. 缓冲区溢出简单介绍

缓冲区溢出:简单的说,缓冲区溢出就是超长的数据向小缓冲区复制,导致数据超出了小缓冲区,导致缓冲区其他的数据遭到破坏,这就是缓冲区溢出。而栈溢出是缓冲区溢出的一种,也是最常见的。只不过栈溢出发生在栈,堆溢出发生在堆,其实都是一样的。

  1. 栈的简单介绍

栈:栈是一种计算机系统中的数据结构,它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来),是一种特殊的线性表。栈的操作常用的有进栈(PUSH),出栈(POP),还有常用的标识栈顶和栈底。

可以把栈想象成一摞扑克牌一样,一张一张叠加起来。(如下图的a1,a2,……,an)。

进栈(PUSH):将一个数据放入栈里叫进栈(PUSH),相当于在扑克牌的在最上面放了一张新的扑克牌。

出栈(POP):将一个数据从栈里取出叫出栈(POP),相当于在扑克牌的在最上面拿走了一张扑克牌。

栈顶:常用寄存器ESP,ESP是栈指针寄存器,其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。

栈底:常用寄存器EBP,EBP是基址指针寄存器,其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。

二 、操作环境:

操作系统:Microsoft  Windows  XP  Professional  Service  Pack  3

辅助工具:VC++ 6.0  、 OllyDbg

三 、 代码部分:

这个代码十分简单,先是定义了一本全局密码(PASSWORD:),如果用户输入的数字和密码相等显示:Success !  You  are right  !,否则显示:incorrect  password  !

值得注意的是,在 test 函数中开辟了一个8字节的局部数组空间,然后再将用户输入的数据复制到这个数组空间中,这就为栈溢出创造了条件,看下结果:

发现了一个有趣的结果,密码12345是正确的密码,这是我们自己定义的,但是当我输入“qqqqqqqq”时,显示的也是正确的结果,下面用OD进行进一步的分析。

四 、 代码分析:

将VC生成的exe放入OD:

OD暂停在了程序的入口点,但是值得我们注意的是,这个不是main函数的入口点,而是编译器预先处理函数的暂停之处,往下拉,进入真正函数开始的地方:

接着进入主函数:

往下走,输入“qqqqqq”,然后来到此处:

发现地址004010E0往后代码部分是进行判断由此推测函数TEST_1.0040100A就是我们的test函数,还需要记住这时的EBP寄存器值:0012FF80和函数下一条地址:004010E5,进入TEST_1.0040100A

然后向下单步,来到00401059处,它的上一步就是strcpy函数,也就是造成溢出的函数,此时观察EAX寄存器在堆栈图中的数据

其中0012FEC0地址处的数据71就是q的ASCII码表现形式,一共输入了6个q所以看到6个71,又因为代码部分是先将ret_num变量进行入栈,且作为strcmp函数的返回值,strcmp(C/C++函数,比较两个字符串,设这两个字符串为str1,str2,若str1==str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。)

我们输入的qqqqqq不是正确的密码,所以大胆推测0012FEC8处的值就是ret_num,往下看0012FECC和0012FED0处储存的值了吗?就是要求大家注意的EBP和EIP(cpu将要执行的下一条指令地址),详细关于调用函数时候的堆栈入栈步骤还请大家自行查阅,叙述起来篇幅过长,此文只为简单讲解栈溢出的基本原理,所以不做过多说明。

刚刚是输入qqqqqq的情况,如果我们输入qqqqqqqqq试一下

发现0012FEC8处的值是71,这就证明了此处存在栈溢出漏洞,下面我们简单利用一下。

  • 简单利用:

由上文可知,当ret_num的值为0的时候,此时程序就会判定我们输入的密码正确,还需知道,由于intel系统设计原因,其实就是内存中的数据按照4字节(DWORD)逆序存储,所以ret_num为1时,内存中存的是0x01000000,如果我们输入包含8个字符的错误密码,如“qqqqqqqq”,那么字符串截断符0x00将写入ret_num变量,这时溢出数组的一个字节0x00将恰好把逆序存放的ret_num变量改为0x00000000。
函数返回,main函数中一看ret_num是0,就会判断结果正确,下面我们看下输入qqqqqqqq情况的堆栈图

发现0012FEC8的值变为了0x00000000,此时判断正确

注意,如果我们的密码当初是定义为1234567时,当我们输入01234567的时候是不行的,虽说0123457也是8位数,但是01234567小于1234567,返回值是-1,在内存里将按照补码存负数,那么字符串截断后符0x00淹没后,变成0x00ffffff,还是非0,这样密码则错误!

六 、 总结:

这只是基本的栈溢出漏洞的讲解,对于新手扫盲还是很有帮助的,希望大家有所学习,日后有机会也会为大家带来更多关于二进制漏洞的讲解和利用方法。新手第一次写文,如若有误,欢迎大家的指正和教导,定虚心学习!不懂之处,也希望大胆询问交流,创造浓郁和谐的学习氛围,再见!

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

栈溢出基本原理的简单讲解 的相关文章

  • 漏洞挖掘-从任意文件读取漏洞到获取账户利用

    开篇 大家好 xff0c 我是承影战队的v1ct0ry xff0c 这次我为大家分享一次比较有趣的漏洞挖掘经历 这次挖掘过程是以灰盒挖掘为主要思想进行展开 xff0c 不熟悉的读者可以阅读上篇文章熟悉一下 一 任意文件读取 开局我们通过扫描
  • 物联网固件逆向分析记录(初步概念记录)

    20201206 1 引言 机缘巧合 自己居然有生之年又接触到了这个东西 但是多学点东西也没什么坏处 就当扩宽视野了 不过 以前这种事情 都没有记录 挺可惜的 所以这次记录一下 关于物联网固件的分析 涉及的东西还是很多的 可能某个领域的小伙
  • xray的使用&实现自动漏扫

    工具 下载地址 https github com chaitin xray releases 查看帮助文档 xray exe webscan h 基本使用 代理模式 xray的优点主要是被动扫描 除了http还需要代理https 生成ca证
  • 从2023蓝帽杯0解题heapSpary入门堆喷

    从2023蓝帽杯0解题heapSpary入门堆喷 关于堆喷 堆喷射 Heap Spraying 是一种计算机安全攻击技术 它旨在在进程的堆中创建多个包含恶意负载的内存块 这种技术允许攻击者避免需要知道负载确切的内存地址 因为通过广泛地 喷射
  • Smartbi 修改用户密码漏洞

    漏洞简介 通过查看 Smartbi 的补丁包信息 发现存在漏洞在某种特定情况下修改用户的密码 进行简单的复现和分析 漏洞复现 在页面上修改密码时 需要知道原本的用户对应的密码 直接构造这样的数据包 就不需要知道原本的密码 知道用户名就可以修
  • AFL 生态圈

    AFL 生态圈 在本文中 我们将讨论的不是经典AFL本身 而是关于为其设计的实用程序及其修改 我们认为 这些实用程序可以显着提高模糊测试的质量 如果你想知道如何提高AFL以及如何更快地找到更多漏洞 继续阅读 什么是AFL 它有什么用 AFL
  • 栈溢出基本原理的简单讲解

    栈溢出基本原理的简单讲解 新手上路 大牛还请自行跳过 不足之处 欢迎批评指正 一 预备知识 缓冲区溢出简单介绍 缓冲区溢出 简单的说 缓冲区溢出就是超长的数据向小缓冲区复制 导致数据超出了小缓冲区 导致缓冲区其他的数据遭到破坏 这就是缓冲区
  • SRC漏洞挖掘经验分享

    文件解析造成的XXE 网站存在一个有意思的功能点 通过上传Excel会将内容显示在页面上 也就是说后端会解析Excel Excel是通过XML来存储数据的 也就是说网站解析了XML 那么我们就可以在XML中注入语句来尝试攻击 新建一个 新建
  • Responder与evil-winRM配合远程登录Windows

    0x01 evil winRM 0x01 1概述 在使用和介绍Responder之前 先来了解一下evil winRM evil winrm是Windows远程管理 WinRM Shell的终极版本 Windows远程管理是WS 管理协议的
  • ASCII码-shellcode的技巧

    网上已经有成熟的工具了 所以就简单记录一下工具怎么用吧 https github com TaQini alpha3 https github com veritas501 ae64 git https github com rcx she
  • 禅道后台命令执行漏洞二

    漏洞简介 禅道是第一款国产的开源项目管理软件 它集产品管理 项目管理 质量管理 文档管理 组织管理和事务管理于一体 是一款专业的研发项目管理软件 完整地覆盖了项目管理的核心流程 禅道管理思想注重实效 功能完备丰富 操作简洁高效 界面美观大方
  • magma测试与安装,使用(含docker配置)

    作者Ubuntu 18 04 Docker的配置与安装 Docker更改镜像源 docker下载ubuntu docker运行进入容器 通过Dockfile更改docker中ubuntu的apt源 docker容器中的ubuntu的配置 下
  • MIPS 指令

    MIPS 指令 指令 功能 应用实例 LB 从存储器中读取一个字节的数据到寄存器中 LB R1 0 R2 LH 从存储器中读取半个字的数据到寄存器中 LH R1 0 R2 LW 从存储器中读取一个字的数据到寄存器中 LW R1 0 R2 L
  • 漏洞挖掘之乱拳打死老师傅——Fuzzer

    背景 Fuzzer是一种通过产生一系列非法的 非预期的或者随机的输入向量给目标程序 从而完成自动化的触发和挖掘目标程序中的安全漏洞的软件测试技术 相比于形式化的软件漏洞测试技术 比如 符号执行技术 Fuzzer往往能够在实际的应用中挖掘更多
  • Apache RocketMQ 远程代码执行漏洞(CVE-2023-33246)

    漏洞简介 RocketMQ 5 1 0及以下版本 在一定条件下 存在远程命令执行风险 RocketMQ的NameServer Broker Controller等多个组件外网泄露 缺乏权限验证 攻击者可以利用该漏洞利用更新配置功能以Rock
  • Skyfire: 一种用于Fuzzing的数据驱动的种子生成工具

    Skyfire Data Driven Seed Generation for Fuzzing 作者 杨鑫 清华大学 论文发表于 IEEE S P 2017 原文作者 Junjie Wang Bihuan Chen Lei Wei and
  • 自学网络安全(黑客)的误区

    前言 网络安全入门到底是先学编程还是先学计算机基础 这是一个争议比较大的问题 有的人会建议先学编程 而有的人会建议先学计算机基础 其实这都是要学的 而且这些对学习网络安全来说非常重要 一 网络安全学习的误区 1 不要试图以编程为基础去学习网
  • 北京大学漏洞报送证书

    获取来源 edusrc 教育漏洞报告平台 url 教育漏洞报告平台 EDUSRC 兑换价格 30金币 获取条件 北京大学任意中危或以上级别漏洞
  • 北京大学漏洞报送证书

    获取来源 edusrc 教育漏洞报告平台 url 教育漏洞报告平台 EDUSRC 兑换价格 30金币 获取条件 北京大学任意中危或以上级别漏洞
  • 小白入门黑客之渗透测试(超详细)基本流程(内附工具)

    经常会收到小伙伴们这样的私信 为什么我总是挖不到漏洞呢 渗透到底是什么样的流程呢 所以全网最详细的渗透测试流程来了 渗透测试其实就是通过一些手段来找到网站 APP 网络服务 软件 服务器等网络设备和应用的漏洞 告诉管理员有哪些漏洞 怎么填补

随机推荐

  • 物联网调查报告:机遇与挑战

    本文转载至 http www infoq com cn news 2014 12 Internet of things opportunities utm campaign infoq content utm source infoq ut
  • 【Debug】ruoyi-vue 启动后登录界面显示系统接口404异常问题解决办法

    首次启动若依项目登录界面出现这个问题百分之九十以上的可能就是端口号的问题 可能你的端口号已经被占用 并且进程并没有杀掉 这时候如果你只改后端的端口号的话还是会报错 因此用下面的方法可以解决这个问题 第一步 在后端 application y
  • STM32单片机开发-UART&USART串口收发-STM32CubeMx项目生成

    目录 一 概述 二 串口通信原理 三 串口调试 四 程序实现 一 阻塞模式 二 中断模式 五 总结 一 概述 本篇文章我们进入STM32串口收发功能的教学 主要讲解阻塞模式与中断模式两种收发模式 源码将在最后免费提供 开发工具 STM32C
  • PHP下载远程图片并保存到本地

    方式1 远程下载图片 param url param string save dir param string filename param int t y p e r
  • 脚本病毒---实验十二:脚本病毒

    目录 一 实验目的及要求 二 实验原理 三 实验环境 四 实验步骤及内容 实验步骤一 vbs virus病毒生成器的了解与操作 实现脚本病毒的源码生成 实验步骤二 复制病毒副本地启动菜单 实验步骤三 禁止显示桌面所有图标 五 实验总结 六
  • Android开发-Intent使用Serializable和Parcelable方式传递数据

    前 言 在Android中一个Activity跳转至另一个Activity或者启动Service 发送广播等都需要Intent 可以说Intent在Android中用途比较广泛 我们还可以通过Intent在跳转至下一个界面或者启动另一个组件
  • 0.net-跨线程使用CSocket

    CSocket断言错误 ASSERT pState gt m hSocketWindow NULL 起因 在套接字处于连接或者发送状态时 试图关闭套接字 于是在这个断言语句处发生中断 原因分析 微软官方解释如下 http support m
  • 论文笔记: 深度学习速度模型构建的层次迁移学习方法 (未完)

    摘要 分享对论文的理解 原文见 J rome Simon Gabriel Fabien Ouellet Erwan Gloaguen and Ishan Khurjekar Hierarchical transfer learning fo
  • echarts自学笔记

    学习echarts的总结 一 图表的实现 1 首先将echarts js引入为echarts提供一个DOM容器 具有宽高 为echarts配置参数 第一步 初始化DOM容器 用echarts init 函数第二步 配置数据选项var opt
  • [机器学习与scikit-learn-33]:算法-回归-通过PolynomialFeatures实现数据的升维

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 123591729 目录 前言 第1章
  • Android 10(Android Q) 适配

    官方网站 沙盒存储 Android Q 中的隐私权 重大隐私权变更 官方网站 展示时间敏感的通知 1 设备硬件信息读取限制 在Android10中 系统不允许普通App请求android permission READ PHONE STAT
  • 已解决:attributeerror: ‘FreeTypeFont‘ object has no attribute ‘getsize‘

    在运行yolov5时 报错 attributeerror FreeTypeFont object has no attribute getsize 在网上搜索的结果大部分给出字体不对 之类的答案 但通过仔细研究 发现该报错的报错原因不是字体
  • CSS3+Html5 学习笔记之css 样式加载顺序

    有时候在写CSS的过程中 某些限制总是不起作用 这就涉及了CSS样式覆盖的问题 如下 navigator height 100 width 200 position absolute left 0 border solid 2 EEE cu
  • 003 数据结构_无头单向非循环链表的详细分解——“C”

    引入 前言 本文介绍的是无头单向非循环链表 这种链表结构简单 一般不会单独用来存数据 实际中更多是作为其他数据结构的子结构 如哈希桶 图的邻接表等等 另外这种结构在笔试面试中出现很多 链表是什么 常见的链表包括 单向链表 singly li
  • IDEA Git回退到指定历史版本

    1 找到要回退的版本号 右击项目 gt Git gt Show History gt 选中要回退的版本 gt Copy Revision Number 2 打开idea的Terminal 输入命令 git reset hard 139dcf
  • Dockerfile解析

    Dockerfile是什么 Dockerfile是用来构建Docker镜像的文本文件 是由一条条构建镜像所需的指令和参数构成的脚本 概述 官网 https docs docker com engine reference builder 构
  • 【CV】第 8 章:语义分割和神经风格迁移

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 传统制造型企业数字化转型面临的问题以及解决方案介绍

    传统制造业数字化转型面临的问题 一直都在关注数字化很久了 就是迟迟不敢动手 这大概是很多企业经营者的心里话 传统制造企业遇到的问题 关键还是在于数字化基础薄弱 1 工业信息化平台与软件繁多 方向和功能也各不同 对于不同的行业类别 生产工艺
  • 为什么基类的析构函数是虚函数

    点击链接查看更多C 技巧 Effective C 考虑以下继承结构 派生类 Derived 中申请了一块内存 使用指针 i ptr 管理 并在析构的时候释放掉 class Base 基类 class Derived public Base
  • 栈溢出基本原理的简单讲解

    栈溢出基本原理的简单讲解 新手上路 大牛还请自行跳过 不足之处 欢迎批评指正 一 预备知识 缓冲区溢出简单介绍 缓冲区溢出 简单的说 缓冲区溢出就是超长的数据向小缓冲区复制 导致数据超出了小缓冲区 导致缓冲区其他的数据遭到破坏 这就是缓冲区