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://xiahunao.cn/news/3015932.html

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

相关文章

国内如何下载TikTOK,手机刷机教程

最近很多玩家都来问怎么刷机&#xff1f;手机环境怎么搭建&#xff1f;这里给大家整理了苹果IOS刷机教程 1.iOS下载教程 &#xff1a; 步骤一&#xff1a;手机调试 苹果手机系统配置推荐&#xff1a;iPhone6S以上&#xff0c;16G。 注意&#xff1a;如果是选择购入二手手机…

【北京迅为】《iTOP-3588开发板源码编译手册》-第4章 Android12/Linux设备树简介

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

千川投流助力直播间场观,快速增粉满足500有效粉标准,轻松开通带货权限和直播间真实流量的提升!

随着短视频带货的兴起&#xff0c;抖音成为了越来越多商家和创业者的首选平台。然而&#xff0c;最近一项新政策给广大抖音创作者带来了一定的挑战&#xff1a;只有拥有500有效粉的账号才能开通带货权限。为了帮助用户满足这一要求&#xff0c;抖音官方渠道推出了巨量千川投流服…

Python实验代码定时调起

Python代码实验调参需要等待1小时运行完成&#xff0c;自动将提前设置的5组参数&#xff08;每组参数有8个&#xff09;间隔1小时之后让Python代码再次自动依次调起运行其中的一组参数&#xff0c;每次跑完将实验结果写一个文件在本地存储通过邮件发送运行结果到指定QQ邮箱 im…

effective python学习笔记_pythonic思维

查py版本 import sys sys.version sys.version_info 遵循PEP8 PEP8,Python Enhancement Proposal #8 章节列了几个点&#xff0c;也可以看原文PEP 8 – Style Guide for Python Code | peps.python.org 导包顺序建议&#xff1a;先导标准库模块&#xff0c;再导三方模块&…

【论文阅读】Fuzz4All: Universal Fuzzing with Large Language Models

文章目录 摘要一、介绍二、Fuzz4All的方法2.1、自动提示2.1.1、自动提示算法2.1.2、自动提示的例子2.1.3、与现有自动提示技术的比较 2.2、fuzzing循环2.2.1、模糊循环算法2.2.2、Oracle 三、实验设计3.1、实现3.2、被测系统和baseline3.3、实验设置以及评估指标 四、结果分析4…

uniapp-ios支付

uniapp安卓包中的微信,支付宝逻辑放在iOS测试包中也能使用. 但询问iOS开发者后得知,有支付相关功能的app要上架苹果,必须先有苹果支付,不然苹果审核不给过.甚至没有支付逻辑,但打包时有支付相关的SDK也不行,苹果会认为你偷偷做了支付逻辑,想要绕开他. 一. 去苹果开发者后台把…

Labels and Databases for Mac:强大的标签与数据库管理工具

Labels and Databases for Mac是一款集标签制作与数据库管理于一体的强大工具&#xff0c;专为Mac用户打造&#xff0c;旨在提供高效、便捷的标签制作与数据管理体验。 这款软件拥有丰富的内置标签格式&#xff0c;用户可轻松创建各种标签、信封和卡片&#xff0c;满足个性化需…

某东抢购某台脚本——高版本

某东抢购某台脚本——高调 小白操作-学习参考 说明 这个脚本用于自动化京东的秒杀过程&#xff0c;特别是对于高需求商品如茅台。它展示了通过自动化工具模拟用户行为的能力&#xff0c;但同时也涉及到了使用自动化脚本可能违反网站使用条款的问题。使用此类脚本前应确保合…

ATFX汇市:日本央行或3万亿干预,日元升值势头显著

​ATFX汇市&#xff1a;4月29日&#xff0c;USDJPY创出历史新高160.21&#xff0c;随后进入快速回落阶段。五个交易日&#xff0c;最低价触及151.86点&#xff0c;相比最高价暴跌835基点&#xff0c;约5.21%。同期的美元指数跌幅仅为0.96%&#xff0c;两者跌幅严重不匹配&#…

编程语言QT、C++、C#、Matlab、SQL Server开发日志总结

目录 引言 正文 1、Qt连接SQL server数据库 2、C#使用chart绘制实时折线图&#xff0c;波形 3、ORACLEXE数据库 4、QT通过ODBC驱动连接Oracle数据库 5、Microsoft SQL Server 2014 安装图解 6、SQL Server 2014应用 7、C/C​​​​​​​ 8、QT…

全国33个省228189个矿产地位置分布数据,含经纬度坐标/CSV格式

全国矿产地分布&#xff08;2021版&#xff09; 数据来源&#xff1a; 全国矿产地数据库2021版 (ngac.org.cn) http://data.ngac.org.cn/mineralresource/index.html 数据获取方法&#xff1a;树谷资料库大全&#xff08;2024年4月19日更新&#xff09; 进入网站后&#xf…

记一次favicon.ico的折腾

某项目需要将前端和后台整合在一起 我也不知道为啥要整合 上面有要求就整呗 正常前端npm run build打包后 dist内会根据设置自动生成favicon.ico文件在根目录下 但由于前后端整合 需要打包后将图标放在dist下的static文件夹里 需要的效果 打包后 index.html里 <link rel&…

网络基础(1)详解

目录 1.计算机网络背景 2.网络协议 3.网络中的地址管理 1.计算机网络背景 1.1 网络发展 (1)计算机从独立模式到网络互联(多态计算机连接共享数据)再到局域网LAN(通过交换机和路由器连接)接着是广域网WAN 1.2 协议 协议就是双方的一种约定. 为什么要有协议? 因为在数据长距…

c++ cpp 在类中执行线程 进行恒定计算

在编程中&#xff0c;顺序执行是常见的模式&#xff0c;但是对cpu的利用率不是很高&#xff0c;采用线程池&#xff0c;又太麻烦了&#xff0c;原因是还得不断地把任务拆分&#xff0c;扫描返回值。 如果 初始化n个类的时候&#xff0c;传递数据自身即可异步计算&#xff0c;那…

Cobalt Strike DNS Beacon使用

0. 前言 1. 实验运行流程 2. 环境搭建 2.1.1 安装虚拟机软件VMware……大家应该都有装吧&#xff0c;这里就不教了 2.1.2 Windows 10虚拟机&#xff08;受害机&#xff09; 2.1.3 Ubuntu虚拟机&#xff08;攻击机&#xff09; 2.1 安装虚拟机 2.2 安装Java 2.3 安装Dock…

CRM定义是什么?

CRM&#xff0c;即客户关系管理&#xff0c;是一种综合性的管理策略&#xff0c;旨在通过一系列技术手段和业务流程&#xff0c;建立、维护和优化企业与客户之间的关系。它不仅仅是一种技术工具&#xff0c;更是一种以客户为中心商业哲学&#xff0c;是现代企业提升竞争力、实现…

社交媒体之谜:深度解析Facebook的内容策略

作为全球最大的社交媒体平台之一&#xff0c;Facebook在内容策略方面一直处于行业的领先地位。其内容策略不仅影响着数十亿用户的信息获取和社交互动&#xff0c;也深刻影响着整个社会的舆论和文化传播。本文将深入探讨Facebook的内容策略&#xff0c;剖析其背后的运作机制和对…

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

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

win10 截图黑屏解决方法

win10 使用QQ截图等第三方工具截图黑屏&#xff0c;提示 Capturing screen is forbidden! 此时winshiftS截图也无法正常工作&#xff0c;解决方法如下&#xff1a; 参考地址&#xff1a;Redirecting