非栈上的格式化字符串漏洞利用

文章介绍了如何在面对非栈上格式化字符串漏洞时,通过已有的栈上指针间接控制非栈上变量,特别是利用保存的ebp链条来修改函数返回地址,从而实现控制流劫持。在ASLR保护下,尽管地址不确定,但可通过爆破半个字节差异找到目标地址并完成利用。

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

引言

对于常规的栈上格式化字符串漏洞,可以直接构造(%c %n 指针)的方式来实现任意地址写,但是对于非栈上变量来说,就无法直接给出目的地址的指针,因为printf的参数保存在寄存器和栈上面。

对于非栈上变量,格式化字符串漏洞依然存在,可以考虑借助已有的栈上指针来实现间接地利用。

原理

0esp
1?
2?
3?
4?
5saved_ebp
6ret_addr
7?
8?
9last saved_ebp

假设 栈的结构如图所示,

我们知道,根据栈帧的结构,保存的ebp会构成一个链条

体现在表中,即是 *5 = &9

要解决 非栈上格式化字符串实现任意写 的功能,即我们需要在栈上有一个保存目标地址的指针。

虽然我们无法直接在栈上写入指针,但是我们可以利用已有的指针。

例如 此时栈上的 &5是一个指针, 它的内容为 &9

我们可以通过 %5&hn 来使用 &5

此时它作为指针,先它保存的地址写入数据

所以数据会被写入到&9

也就是说,我们可以通过 &5 来控制 &9 的内容。

此时我们选择 将 &9 的内容改为 &6

0esp
1?
2?
3?
4?
5saved_ebp
6ret_addr
7?
8?
9&6

这个时候,我们可以通过 %9$hn 来利用 &9

&9保存了 &6

因此,可以修改&6的内容

而 &6 是 函数的返回地址,将它改成 后门函数 等,即可实现劫持控制流的效果。

例子 xman_2019_format

观察ebp链条

ebp 0xfff154e8 —▸ 0xfff15508 —▸ 0xfff15538 —▸ 0xfff15548 —▸ 0xfff15558 ◂— ...

可以发现只有最后一个字节不同

更具体点,只有半个字节不同

 按照上面所说的原理,可以利用 &0a 把 &12 的内容改为 &0b, 再通过 &12 将 &0b改为后门函数的地址。

由于 ASLR 的存在,事实上&0b的地址并不确定,但是由于只有 半个字节 与原值的差异,所以可以爆破 &0b,完成利用。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值