美文网首页
堆溢出之House系列——“This is my horse!”

堆溢出之House系列——“This is my horse!”

作者: BJChangAn | 来源:发表于2018-02-16 18:33 被阅读0次

    This is my house!

    2009.3.9 热火vs公牛 德怀特·韦德第二次加时绝杀

    哈哈补一张今天份的This is my f-king house

    2018 5.21 勇士vs火箭 西决G3 斯蒂芬·库里

    0x00 House of Spirit

    #include<stdio.h>

    #include<stdlib.h>

    int main(){

       unsigned long long fake_chunks[10];

       printf("build fake chunk at %p\n",fake_chunks);

       fake_chunks[1] = 0x40;

       fake_chunks[9] = 0x1234; // 0x40/sizeof(unsigned long long) = 8

       free(&fake_chunks[2]);

       char* p = malloc(0x30);

       printf("Then malloc a chunk ,address is: %p\n",p);

       return 0;}

    运行结果:

    看起来不一样但其实是一样的没毛病

    Example:L-CTF2016 pwn200

    1.一脸蒙蔽

    2.发现了who are u时的%s没有截断导致的栈上数据泄露,正好是一个栈地址

    3.到give me money的时候一个典型的strcpy溢出漏洞,可以overflow保存在栈上的堆地址,进而修改.bss中ptr指针的内容。

    4.因为是在 "哦这是一道HouseOfSpirit" 的情况下来看这道题,所以紧接着就想着在栈上伪造好堆块然后free掉,然后malloc回来,其size范围内恰好有一个返回地址(程序其实是一个不断 return func() 的结构,很多返回地址存在栈上,程序返回时将一一被用到),一些需要注意的细节:

                  1) 堆地址16字节对齐

                  2) fake next chunk的size不能太大

    5.因为要返回地址正好落在两个fake chunk之间,很容易想到两个fake chunk必须构造在不同的栈帧当中,first chunk当然是放在0x400a29的buf里,next chunk的话找了一阵子,尝试过:

                  1) 利用栈中已有的数据(主要是size位的要求)其实符合条件的size还是有的,但是后面check in的时候有size<128的限制,这个范围卡的就比较严苛了。

                  2) 一脸蒙蔽

    后来仔细看这个位置,其实get_num是有返回值保存在当前栈帧中的,可以将其作为fake next chunk的size位(事实上free()对fake chunk的fake next chunk的presize位都没有什么检查)

    5.在give me money的buf中构造fake chunk和shellcode,然后直接check out,把fake chunk的地址(其后就是一个保存在栈上的返回地址)加入fast bin,然后再check in该地址malloc回来,然后give me more里面修改栈上的返回地址为shellcode起始地址。

    6.然后退出,一直返回,直到ret到执行shellcode。


    0x01 House of Lore

    仍然是一个demo,在别人基础上加的注释,不知道哪里来的勇气用英?文写:

    HouseOfLore.c

    要点在于通过溢出覆盖smallbin中堆块的bk指针,使其指向我们伪造的chunk1,并在chunk1后面伪造chunk2来通过检查。malloc每次从smallbin尾部开始取,取出victim后将其bk指向的堆块填入smallbin中,下次malloc就会返回fake chunk1的地址。

    用途主要是在栈上伪造堆块,并使得malloc返回栈地址,再对分配的堆块进行操作,可以覆盖eip,甚至绕过canary检查。

    0x02 House of Force

    思路是覆盖top chunk的size为-1这种,然后malloc一个大的堆块

    心有多大,就能分配多大,至于具体有多大,一直覆盖到栈段之类的,然后就可以写入了。至于想要精确定位,还要结合泄露堆地址和栈地址来计算需要分配多大的堆块。

    相关文章

      网友评论

          本文标题:堆溢出之House系列——“This is my horse!”

          本文链接:https://www.haomeiwen.com/subject/ktnytftx.html