Fastbins attack : Alloc_to_stack
这个利用技巧与前面的house of spirit 和 double free很类似。都是利用fastbins 中单链表成员只用 fd 指针这个特点来将伪造的fake_chunk 挂进 fastbins中再申请出来进行利用
回到我们的主题啊,alloc_to_stack,顾名思义,这个技巧就是修改fd 指针将伪造的fake_chunk分配到栈段上面去。
演示:
#所用例子为wiki上的例子#
typedef struct _chunk
{
long long pre_size;
long long size;
long long fd;
long long bk;
} CHUNK,*PCHUNK;
int main(void)
{
CHUNK stack_chunk;
void *chunk1;
void *chunk_a;
stack_chunk.size=0x21;
chunk1=malloc(0x10);
free(chunk1);
*(long long *)chunk1=&stack_chunk;
malloc(0x10);
chunk_a=malloc(0x10);
return 0;
}
讲一下这个程序的流程:
首先模仿正常chunk定义了一个chunk结构体,并定义了一个结构体变量 PCHUNK。进入主函数,首先定义了一个结构体变量stack_chunk,然后定义了两个指针,为stack_chunk分配了一个0x10大小的堆块,之后将其释放。之后将stack_chunk 所在位置的指针赋给chunk1 ,之后申请0x10大小的堆块,并将堆块指针分配给 chunk_。
使用gcc -g test.c -o test 这个命令编译生成一个可执行文件,并用gdb调试一下:
首先将断点下在第19 行,将程序运行到这里,看一下我们申请分配的的堆块中的内容:
就是一个正常的chunk。然后我们将断点下在21行,也就是释放完堆块后的一步,这个时候我们看一下bin 中的情况:
可以看见这个堆块去往了fastbins 。之后我们顺着程序的流程继续往下,可以发现我们这个程序是存在漏洞的:在释放掉第一个malloc分配的堆块后并没有将指向这个堆块的指针置空,这里就出现了一个 use after free 的漏洞(也就是我们可以利用没有被置空的chunk1 指针对这个地址上的堆块进行修改)
在程序中的:
*(long long *)chunk1=&stack_chunk;
这一句就是对这个chunk中fd指针进行修改,将它改为先前定义的那个stack_chunk 所指向的堆块地址。
由于 fd指针被修改和fastbins 的机制,这个本来不属于程序本身分配的一段内存就被挂进了fastbins,这样我们就能将这个在栈上伪造的堆块挂进fastbins ,并且由于它的位置是被修改的堆块的fd 指针,所以在下一次同大小的分配中,我们就可以再次启用它了。
步进程序看一下这个操作:
可以看见一个栈地址被挂进了fastbins ,而且还被peda给检测出来了😂
再往后步进去看一下对这个我们分配之后对这个stack_chunk 的再次启用:
可以看见这个栈段现在已经作为一个chunk 并且能被我们所控制了