写于2021.4.26 0:17
仅对自己的学习做一波总结和程序调试
首先编写一个程序
#include<stdio.h>
#include<malloc.h>
#include<unistd.h>
#include<string.h>
int main()
{
int size = 0x100;
char p = malloc(size);
printf("%p\n",p);
free(p);
(long)(p+8) = 0x601100;
char *r= malloc(size);
printf("%p\n",r);
return 0;
}
我们一步步进行gdb跟进。come on
首先进行malloc一个0x100大小的heap空间
上边的这个是我们malloc的,下方的是top chunk。(这里有个小细节,大家可以看到我malloc之后,打印p的地址为0x602010,而不是0x602000,因为p指向的是fd指针。)
n进行单步执行。
会发现多出来了一个heap,那个是printf的缓冲区(没啥影响)
然后已经free掉的chunk的fd和bk都指向0x7ffff7dd1b78 <main_arena+88>(这个地址是unsorted bin的fd指针的地址,这说明仅有一个chunk时,其fd和bk都指向那个确定地址)
下面一步的代码是将p+8这个位置赋值,赋得值是我们将要找到的目标地址
然后进行的是malloc,malloc对这个链进行的操作是解链操作(partial unlink)解链的第一步是跟随0x602000的bk找到(下一个chunk)即target,然后将main_arena的fd写入target的fd中。
第二步是跟着0x602000的bk找到下一个chunk,将0x602000的bk值传递给main_arena的bk,则main_arena的bk为target的地址了
此时target的fd指针被写入了main_arena+0x58地址。
通过上边的操作,我们向0x601100写入了数据,就可以找到0x7f了,将0x7f作为malloc回去的size段即可进行fastbin attack
这里不会截稿