PWN入门--栈溢出

PWN入门–栈溢出

栈概要

  1. 介于网上各种wp在栈溢出利用脚本方面浅入浅出,深入讲一下栈溢出利用时,地址如何计算,栈中垃圾数据如何填充,函数调用时 参数 在栈中的分布, 栈帧的生成,函数返回值ip在栈中的摆放位置,填充垃圾数据时大小的确定和 原返回值 的利用等等。
  2. 本文以下面源代码位实例,各位自行生成其 32位64位 的程序:
#include <stdio.h>
void fun(int a,int b)
{printf("%d",a+b);
}
int main()
{int a=1,b=2;printf("enter fun\n");fun(a,b);return 0;
}
栈帧
  1. 栈帧:利用 ebp寄存器 访问栈内局部变量、参数、函数返回地址等的手段。
  2. 在一个函数的开头,通常会有push ebp;mov ebp,esp这一组指令:image-20240507154958259
  3. 当一个函数被调用时,会在程序的调用栈上开辟一块空间,这块空间就是 栈帧 ,首先时保存当前指针寄存器( push ebp ),该值指向 调用函数者 (例子中即位main函数的底部)的栈底部;接下来,为新栈帧分配空间( mov ebp,esp ),这个空间用于存放函数的参数、局部变量以及返回地址,函数在后面以 ebp为基地址 来访问函数内部的变量。
  4. 例如,在main函数中,[ebp+var_C][ebp+var_10] 来访问变量a,b,该ebp即为main函数的栈低指针(为什么是栈低?因为mov ebp,esp指令使bp和sp同值,后续sp寄存器如何变化栈如何上涨,ebp寄存器都不会变化):image-20240507155750697
  5. 下面动调追踪这个过程
  • 从此处开始生成main函数的栈帧。image-20240507161443030

  • 观察右边ebp寄存器和栈的数值,ebp寄存器 0xFF95F6A8 已经指向栈低:image-20240507161701901

  • 继续观察如何利用bp寄存器来访问局部变量,可以看到使用 ebp寄存器 为基地址给参数完成赋值,参数在栈中的位置如图中右下角,并且只要在main函数中ebp寄存器的值就不会变化:image-20240507162105764

  • 后面看到盗用fun函数的过程,使用栈完成传参,此时还没有进入到fun函数,所以其 栈帧 还并未生成:image-20240507162733874

  • 进入fun函数,首先使用push ebp;mov ebp,esp来生成 fun函数的栈帧 ,将原main函数的ebp值栈低入栈保存,再为ebp换上新的esp寄存器值,作为访问fun函数局部变量等的基址。

  • 注意:main函数传递给fun函数的参数与栈帧ebp之间还存在一个地址 565CE21D 这时作为fun函数的 返回地址 ,在栈溢出的漏洞中,我们经常要用我们 需要的地址 来覆盖其正常的返回地址,来修改返回值eip的值,从而达到利用栈溢出漏洞的目的(后面覆盖地址的时候会细讲):image-20240507163133203

  • 最后退出fun函数,需要将原ebp的值恢复,关闭并销毁fun函数的栈帧:通常使用与生成栈帧相反的指令mov esp,ebp;pop ebp,该例子中使用 leave 指令同理,用于快速关闭栈帧。

  • Leave指令在汇编语言中用于快速关闭栈帧,通常出现在函数的末尾

    Leave 指令的主要作用是恢复堆栈指针(ESP)和基址指针(EBP)到它们之前的值,从而释放分配给当前函数调用的堆栈空间。具体来说:

    1. 恢复堆栈指针:Leave 指令将 EBP 寄存器的内容复制到 ESP 寄存器中,这样做的效果是将堆栈指针恢复到函数调用前的位置。
    2. 恢复基址指针:接着,Leave 指令从堆栈中弹出之前保存的 EBP 的值,恢复到 EBP 寄存器,这样就恢复了基址指针到调用本函数前的地址。
    3. 简化操作:使用 Leave 指令可以替代序列 “mov esp, ebp; pop ebp” 的两条单独指令,它使得关闭栈帧的操作更加简洁。
  • image-20240507164401559

  • 最后,在main函数中删除栈(在调用者还是在被调用者中清除栈,取决于函数的调用规定)。

栈漏洞利用
  1. 前面说完函数调用过成中返回值、栈帧、局部变量等问题,后面来讨论栈漏洞如何进行利用,以具体题目为例。

  2. 题目地址:jarvisoj_level2

  3. 这次从栈的角度详细,计算垃圾数据填充大小时多少,system函数的参数如何传递的问题。

  4. buf只有136个字节大小,但是read函数给了256个输入,必然存在栈溢出:image-20240507165958563

  5. 其函数的栈示意图如下,那么返回地址一改填充在哪里?传递的参数地址有一改放哪里呢?:image-20240507170038228

  6. 动调进入vulnerable_function函数,观察其栈中的变化:

    • 此时vulnerable_function函数的栈帧已经生成:可以以ebp寄存器为基地址来访问变量buf。image-20240507170853404
    • 再看ebp寄存器指向栈处的下面一位,那是该函数的返回值,该地址即为main函数中 call vulnerable_function 的后一位指令地址:image-20240507171208342
    • 观察,调用system函数的过程,先将使用的参数地址入栈,再 call system,(后面伪造指令时要按此为依据):image-20240507171554654
    • 后续调用read函数来读取输入:此时是溢出的关键,观察栈中的变化,其将 buf的首地址 和 read函数读取的大小 均入栈。image-20240507172025116
    • 开始接受输入:输入从buf的首地址开始,一直向下延申buf数组的大小,计算一下如果按正常的 buf数组大小 即0x88来输入,其最后应该在栈中的什么地方:0xFFA669A0+0x88=0xFFA66A28
    • 观察 0xFFA66A28 在栈中的位置:恰好位于该函数的栈底即ebp所指向的位置,再往后两个字节不就是我们梦寐以求的返回地址了吗。image-20240507172641261
    • 由上面分析可以看出来,平常在进行栈溢出时,地址、大小的计算、垃圾数据的填充,除了要算上 buf数组本身 的大小以外 还要将该函数生成栈帧时(push ebp)的ebp/rbp的数据进行覆盖,填充的大小为 136+4 , 最后才能到达梦寐以求的 返回值地址
    • 前面已经分析如何覆盖到返回值的地址,但是光有返回值还不行,还需要给 call system传参才能达到提权的目的( system(“\bin\sh”) ),观察前面在调用system指令时,先将传入的参数地址入栈,然后才再call system,所以我们在向栈中填入数据时要遵循这个步骤。
    • 那么如何构造才能达到push 的目的?:原先正常在进入到system函数时,栈中的数据应该是如下表现:所以我们构造的栈应该满足该结构。传入的参数地址 在system的返回值下面(先入栈),而后就是 返回值地址 (后入栈)

    image-20240507180400872

    • 在前面 0xFFA66A28+4的位置填入我们需要跳转到的位置 804845C (任意call system指令处),执行该指令会自动向 0xFFA66A28+4 处填入system的返回值地址,所以只需要在该位置的下面0xFFA66A28+4+4 处再填入push的参数地址即可模仿该栈的样式。
    • 那再栈溢出后需不需要考虑 esp寄存器的值 呢,毕竟如果esp寄存器在退出read函数后不指向0xFFA66A28+4 那么call指令自动填充的返回值与push参数地址的位置就差远了,其实这个完全不用考虑,一位esp寄存器的值开始在栈帧生成后就一直保存在ebp寄存器中,在函数运行时ebp寄存器的值不会变化,而栈溢出的数据也不会影响到ebp的值(但是关闭栈帧时会影响),所以esp寄存器在退出read函数后一定会指向 FFA66A2C ,不管是否溢出。
    1. 最后解题脚本如下:
    from pwn import *p = remote('node5.buuoj.cn',25955)full=136+4
    sys_address=0x804849E
    shell_address=0x804A024payload = b'a'*(full)+p32(sys_address)+p32(shell_address)
    p.sendline(payload)
    p.interactive()
    image-20240507180621342
    1. 毕了吧!!!

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

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

相关文章

【强化学习】公平性Actor-Critic算法

Bringing Fairness to Actor-Critic Reinforcement Learning for Network Utility Optimization 阅读笔记 Problem FormulationLearning AlgorithmLearning with Multiplicative-Adjusted RewardsSolving Fairness Utility Optimization Evaluations 在网络优化问题中&#xff…

了解外汇震荡类货币对特征与交易策略

外汇市场是全球最大的金融市场&#xff0c;每天的交易量超过6万亿美元。在这个市场上&#xff0c;货币对之间的价格变动反映了全球经济和政治动态。外汇货币对通常被分为三类&#xff1a;主要货币对、次要货币对和外来货币对。而在交易这些货币对时&#xff0c;市场表现通常分为…

适合小白使用的编译器(c语言和Java编译器专属篇)

本节课主要讲如何安装适合编程小白的编译器 废话不多说&#xff0c;我们现在开始 c/c篇 首先&#xff0c;进入edge浏览器&#xff0c;在搜索框输入visual studio &#xff0c;找到带我画圈的图标&#xff0c;点击downloads 找到community版&#xff08;社区版&#xff09;的下…

BFS Ekoparty 2022 -- Linux Kernel Exploitation Challenge

前言 昨天一个师傅给了我一道 linux kernel pwn 题目&#xff0c;然后我看了感觉非常有意思&#xff0c;题目也不算难&#xff08;在看了作者的提示下&#xff09;&#xff0c;所以就花时间做了做&#xff0c;在这里简单记录一下。这个题是 BFS Lab 2022 年的一道招聘题&#…

原型模式类图与代码

现要求实现一个能够自动生成求职简历的程序&#xff0c;简历的基本内容包括求职者的姓名、性别、年龄及工作经历。希望每份简历中的工作经历有所不同&#xff0c;并尽量减少程序中的重复代码。 采用原型模式(Prototype)来实现上述要求&#xff0c;得到如图 7.25 所示的类图。 原…

FME学习之旅---day26

我们付出一些成本&#xff0c;时间的或者其他&#xff0c;最终总能收获一些什么。 【由于上周&#xff0c;上班状态不是很好&#xff0c;事情多又杂&#xff0c;没有学习的劲头&#xff0c;就短暂的休息了一下下。双休爬山&#xff0c;给自己上了强度&#xff0c;今天才缓过来…

品高虚拟化后端存储的发展演进

在品高虚拟化技术不断发展的过程中&#xff0c;虚拟化的后端存储一直是关注的焦点之一。 本文将从最初的文件存储和NFS开始&#xff0c;追溯到集中式存储SAN&#xff0c;然后选择了Ceph的RBD方式&#xff0c;并最终抵达选择支持vhost协议的后端存储的现状&#xff0c;我们将探…

Android 桌面小组件 AppWidgetProvider

Android 桌面小组件 AppWidgetProvider 简介 小组件就是可以添加到手机桌面的窗口。点击窗口可以进入应用或者进入应用的某一个页面。 widget 组件 如需创建 widget&#xff0c;您需要以下基本组件&#xff1a; AppWidgetProviderInfo 对象 描述 widget 的元数据&#xff0…

一键式手机文件传输,让你生活更便捷!

随着手机功能不断增强&#xff0c;我们经常需要在不同设备之间传输文件&#xff0c;如照片、音乐、视频、文档等。不过&#xff0c;现在有许多应用程序和技术可以帮助我们实现手机文件传输的便捷和快速。本文将介绍2类让手机文件传输一键完成的方法&#xff0c;让你的生活更加便…

redis 使用记录

redis 使用记录 下载运行配置文件启动 参考 下载 github: Redis for Windows 或者从百度网盘下载 Redis version 3.2.100 链接: https://pan.baidu.com/s/1kxNOuZFunvVhVy1cfQzCDA?pwdpibh 运行 双击运行 运行效果 如果出错&#xff1a;查看是否项目路径是否包含中文 配…

如何用virtualbox 来跑openwrt 镜像?

1.下载好openwrt源代吗&#xff0c;编译之前先配置&#xff0c;让编译产生x86的virtualbox 镜像&#xff1a; 编译完成之后会产生vdi镜像文件&#xff0c; 在virtualbox 中创建一虚拟机&#xff0c;类型选择linux,版本other linux 64: 内存选择512&#xff1a; 这个地方把镜像…

AUTOSAR中EcuM、ComM和CanNm的关联

ComM的内外部唤醒 ComM可以通过NM保持网络的唤醒&#xff0c;同时也可以通过SM激活通信&#xff0c;总之就像一个通信的总管。 下面通过两种唤醒源来解释ComM的状态机。 1、内部唤醒 ① 当ComM上电初始化时会首先进入NO COMMUNICATION状态&#xff0c;在该状态下ComM会持续循…

TriCore TC162 Archievture Volume 笔记

说明 本文是 英飞凌 架构文档 TriCore TC162P core archiecture Volume 1 of 2 (infineon.com) 的文笔&#xff0c;稍作整理方便查阅&#xff0c;错误之处&#xff0c;还请指正&#xff0c;谢谢 :) 1. Architecture 2. General Purpose & System Register 名词列表&#…

【Python爬虫实战入门】:全球天气信息爬取

文章目录 一、爬取需求二、所需第三方库2.1 简介 三、实战案例四、完整代码 一、爬取需求 目标网站&#xff1a;http://www.weather.com.cn/textFC/hb.shtml 需求&#xff1a;爬取全国的天气&#xff08;获取城市以及最低气温&#xff09; 目标url&#xff1a;http://www.weath…

项目计划书(Word原件)

项目开发计划包括项目描述、项目组织、成本预算、人力资源估算、设备资源计划、沟通计划、采购计划、风险计划、项目过程定义及项目的进度安排和里程碑、质量计划、数据管理计划、度量和分析计划、监控计划和培训计划等。 软件资料清单列表部分文档&#xff1a; 工作安排任务书…

人脸采集训练识别

项目概述&#xff1a; 本地摄像头采集人脸数据集&#xff0c;通过训练得到trainingData.yml模型&#xff0c;加载haarcascade_frontalface_default.xml实现人脸识别。haarcascade_frontalface_default.xml 文件并不是一个完整的人脸识别模型&#xff0c;而是一个用于检测正脸&a…

Llama3-Tutorial之XTuner微调Llama3图片理解多模态

Llama3-Tutorial之XTuner微调Llama3图片理解多模态 基于 Llama3-8B-Instruct 和 XTuner 团队预训练好的 Image Projector 微调自己的多模态图文理解模型 LLaVA。 参考&#xff1a; https://github.com/SmartFlowAI/Llama3-Tutorial 1. 环境、模型、数据准备 1.1 配置环境 使用如…

【算法】双指针

下面是对双指针算法的题目总结和归纳&#xff0c;有需要借鉴即可。 双指针算法习题目录 1.移动零2.复写零3.快乐数4.盛最多水的容器5.有效三角形的个数6.和为s的两个数7.三数之和8.四数之和 1.移动零 题目链接&#xff1a;LINK 题解&#xff1a; 思路①&#xff1a;暴力求解 …

【备战软考(嵌入式系统设计师)】08 - 多媒体技术信息安全

多媒体技术 这内容比较杂&#xff0c;而且跟咱嵌入式的关系不大&#xff0c;但是软考里会考一些&#xff0c;下面我就结合我已经刷过的一千多道往年真题概括总结一下常考的知识点。 媒体分类 首先媒体分为五类&#xff1a; 感觉媒体&#xff0c;让人直接感觉得到的媒体&…

zTasker v1.88.1一键定时自动化任务

软件介绍 zTasker是一款完全免费支持定时、热键或条件触发的方式执行多种自动化任务的小工具&#xff0c;支持win7-11。其支持超过100种任务类型&#xff0c;50种定时/条件执行方法&#xff0c;而且任务列表可以随意编辑、排列、移动、更改类型&#xff0c;支持任务执行日志&a…