
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

最低0.47元/天 解锁文章
653

被折叠的 条评论
为什么被折叠?



