Fastbin Attack理论学习

跟着ctf-wiki学一下fastbin attack的原理,题目有时间再看看吧xD

环境搭建?

由于在上古时期还没有tcache(这是在glibc2-26加入的),所以要换一个低版本libc进行实验。

用到的方法(注:新版本gdb不需要更改.debug)

https://sillyrabbit.cn/pwn/patchif和glibc-all-in_one使用笔记/

可以写一个脚本,编译后直接改libc

#!/bin/bash
gcc -o learn learn.c
patchelf --replace-needed libc.so.6 ~/1pwn/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc-2.23.so ./learn
patchelf --set-interpreter ~/1pwn/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/ld-2.23.so ./learn

chunk size字段的含义

gdb输入vis相同颜色的部分,不包括pre_size?

Fastbin Double Free

主要是要了解fastbin的链表是怎么维护的。调一下以下程序:

#include <stdlib.h>
int main(void)
{
    void *chunk1,*chunk2;
    chunk1=malloc(0x30);
    chunk2=malloc(0x30);
    //进行释放
    free(chunk1);
    free(chunk2);
    chunk1=malloc(0x30);

    return 0;
}

两次malloc后,vis查看堆

image

从上往下是chunk1 chunk2

free(chunk1);后:

image

image

此时的fastbin链表(图片从ctf-wiki偷的hh

image

free(chunk2)

image

此时的链表

image

此时再chunk1=malloc(0x30)申请内存后

image

又变成了

image

由此看到,每次free后会从fastbin链表头部插入新chunk指针,重新malloc则使用头部的chunk指针

所以如果这样操作

int main(void)
{
    void *chunk1,*chunk2,*chunk3;
    chunk1=malloc(0x10);
    chunk2=malloc(0x10);

    free(chunk1);
    free(chunk2);
    free(chunk1);
    return 0;
}

执行完之后链表则会变成这样

image

这时候如果第一次调用 malloc 返回 chunk1 之后修改 chunk1 的 fd 指针为 addr,那么第4次malloc的时候就可以在addr上伪造一个chunk,相当于任意地址写入。详细验证见ctf-wiki

House Of Spirit

用途:修改某地址addr前后的一些数据,然后free(addr),可以把一个chunk分配到addr上。要求见ctf-wiki

调试how2heap.c
image

Alloc to Stack

即是把chunk的fd改成栈上的地址,从而在malloc的时候在栈上开chunk任意写

注意栈上的size字段要控制好

Arbitrary Alloc

同上

posted @ 2022-08-29 18:35  KingBridge  阅读(46)  评论(0编辑  收藏  举报