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,在别人基础上加的注释,不知道哪里来的勇气用英?文写:
要点在于通过溢出覆盖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一个大的堆块
心有多大,就能分配多大,至于具体有多大,一直覆盖到栈段之类的,然后就可以写入了。至于想要精确定位,还要结合泄露堆地址和栈地址来计算需要分配多大的堆块。
网友评论