FSOP

FSOP

​   进程内所有的_IO_FILE结构会使用_chain域相互连接形成一个链表,这个链表的头部由_IO_list_all维护。

在这里插入图片描述

​   FSOP的核心思想就是劫持_IO_list_all的值来伪造链表和其中的_IO_FILE项,但是单纯的伪造只是构造了数据还需要某种方法进行触发。FSOP选择的触发方法是调用_IO_flush_all_lockp,这个函数会刷新_IO_list_all链表中所有项的文件流,相当于对每个FILE调用fflush,也对应着会调用_IO_FILE_plus.vtable中的_IO_overflow。

在这里插入图片描述

_IO_flush_all_lockp的触发方式

1.当libc执行abort流程时

2.当执行exit函数时

3.当执行流从main函数返回时

_IO_flush_all_lockp的触发流程图

在这里插入图片描述

由源码可以知道为了在执行_IO_flush_all_lockp函数时能够跳转到vtable上的__overflow(64位下偏移为0x18),我们需要伪造的地方

1,_IO_list_all指针的值 使其指向我们伪造的_IO_FILE_plus结构

2,fp->_mode 满足条件fp->_mode<=0

3,fp->_IO_write_ptr ,fp->_IO_write_base 满足条件fp->_IO_write_ptr > fp->_IO_write_base

4,vtable偏移量为0x18的地方 填入onegadget或者system

FSOP攻击图解

在这里插入图片描述

演示代码

#define mode_offset 0xc0
#define writeptr_offset 0x28
#define writebase_offset 0x20
#define vtable_offset 0xd8

int main(void)
{
    void *ptr;
    long long *list_all_ptr;

    ptr=malloc(0x200);

    *(long long*)((long long)ptr+mode_offset)=0x0;
    *(long long*)((long long)ptr+writeptr_offset)=0x1;
    *(long long*)((long long)ptr+writebase_offset)=0x0;
    *(long long*)((long long)ptr+vtable_offset)=((long long)ptr+0x100);

    *(long long*)((long long)ptr+0x100+24)=0x41414141;

    list_all_ptr=(long long *)_IO_list_all;

    list_all_ptr[0]=ptr;

    exit(0);
}



执行到exit(0)的时候触发了_IO_flush_all_lockp,gdb运行结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值