2020 西湖论剑 pwn noleakfmt

在这里插入图片描述
canary没开,方便溢出。

主逻辑简单。
在这里插入图片描述
格式化字符串漏洞。
给了我们一个栈地址,但是主要问题是把标准输出关掉了。
我们要利用的呢就是将_IO_2_1_stdout_的_fileno从1改成2,为啥呢?
对于一个FILE结构体来说,最重要的就是_flags和_fileno,_fileno存储的是我们的文件描述符,对于某些情况或许我们要劫持_fileno才能达到我们的目的,而_flags则标志了该FILE的一些行为,这对于我们的泄露至关重要。

我们想办法劫持结构体的_fileno之后就可以从标准错误做一个输出。

那我们利用的一个思路如下。

第一步的思路是调用printf函数时会把_IO_2_1_stdout_的地址入栈。通过修改printf的函数返回地址为start可以使栈向低地址生长,这样就可以利用栈中的_IO_2_1_stdout_的地址
首先利用main函数返回值下面的一条栈指针链来修改printf的返回地址。
在这里插入图片描述
在这里插入图片描述
然后利用这个链条来把printf的返回值修改成start函数。
在这里插入图片描述
这里会因为地址问题我们需要爆破一下,调试的时候可以直接用set指令来改过来。

在这里插入图片描述

开始执行start函数。

然后就会有IO_FILE的指针。
在这里插入图片描述

在最下面又有一个链,我们来用它攻击_IO_2_1_stdout_
在这里插入图片描述

然后是第二步:修改_IO_2_1_stdout_的fileno的值为0x2
在这里插入图片描述

在这里插入图片描述

第三步泄漏libc地址
在这里插入图片描述

第四步修改栈中的数据为__malloc_hook的地址
向__malloc_hook中写入one_gadget
利用printf打印大量字符调用malloc

这就像非栈上的格式化字符串漏洞一样,利用栈链,将one_gadget写到malloc_hook就可以了。

第五步因为标准输出关了,所以就cat flag 1>&2

在这里插入图片描述

exp

#!/usr/bin/python3
#-*- coding:utf8 -*-
from pwn import *

context.log_level = 'debug'
libc = ELF('./libc.so.6')

def pwn(param1, param2, param3, p):
    payload = '%{}c%{}${}'.format(param1, param2, param3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值