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查看堆
从上往下是chunk1 chunk2
free(chunk1);
后:
此时的fastbin链表(图片从ctf-wiki偷的hh
free(chunk2)
后
此时的链表
此时再chunk1=malloc(0x30)
申请内存后
又变成了
由此看到,每次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;
}
执行完之后链表则会变成这样
这时候如果第一次调用 malloc 返回 chunk1 之后修改 chunk1 的 fd 指针为 addr,那么第4次malloc的时候就可以在addr上伪造一个chunk,相当于任意地址写入。详细验证见ctf-wiki
House Of Spirit
用途:修改某地址addr前后的一些数据,然后free(addr),可以把一个chunk分配到addr上。要求见ctf-wiki
调试how2heap.c
Alloc to Stack
即是把chunk的fd改成栈上的地址,从而在malloc的时候在栈上开chunk任意写
注意栈上的size字段要控制好
Arbitrary Alloc
同上