BUUCTF axb_2019_fmt32

博客详细讨论了如何在没有后门和系统函数的情况下,通过BUUCTF axb_2019_fmt32挑战中的格式化字符串漏洞泄露libc函数地址,进而控制程序流程。作者分析了栈布局,尝试了不同方法,如覆盖strlen函数的got表为system,最终采用%hn分两次写入高2字节和低2字节的方式来实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

在这里插入图片描述

主程序就是这样的,能看到有一个printf的格式化字符串漏洞
sprintf 相当于把参数替换了之后的格式化字符串送入了第一个参数,也就是format

首先,没有后门也没有系统函数,要用格式化字符串泄露出某个libc函数,来获得libc基址
然后,仔细算一下 s 和 format 两个参数,都没有溢出,,也没有函数能写进got表,,所以还是再次利用格式化字符串漏洞通过%n来写入数据

先看一下我们输入的数据在栈上的布局:
在这里插入图片描述

这里面
1 是格式化字符串的指针,指向了栈上 format的位置,,
2 是我们输入东西的位置的指针
3 是我们输入的东西存储的地方,,注意,以这个程序为例,他储存的地方是 0xfffcdaf 并不是一个对齐的地址,,覆盖的时候要注意

在这里插入图片描述

我们运行程序,输入 %1$s ,,Reapeater:后面输出的是 Reapeater这一句
在这里插入图片描述

所以这样计算偏移的话,我们输入的东西的位置+1 就是格式化字符串的 第8个参数

之后通过构造,将要泄露的got地址写进第8个参数的位置,再通过 %8$s 泄露

之后我们要覆盖一个函数的got表内容为system
网上一些人做的是覆盖printf的
在这里插入图片描述
但是我这么做一直报错,可能是因为循环之后还会用到printf,但是里面的参数是 Please … 这一句,system无法执行吧
我覆盖的是strlen函数,因为它的参数我们可控

之后就是怎么写入了
之前做过这样的题,,只是用 %好多c 和 %n 写入,但是这次写的数是个地址,有些大了可能就不行,会发生超时什么的࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值