House of Spirit(hos)是一个组合型的漏洞利用,是变量覆盖和堆管理机制的组合利用。是构造一个 fake chunk,然后释放掉它,这样再次申请的时候就会申请它。具体来说,关键在于能够覆盖一个堆指针变量,使其指向可控的区域,只要构造好数据,释放后系统会错误的将该区域作为堆块放到相应的fast bin里面,最后再分配出来的时候,就有可能改写我们目标区域。
1. 想要控制的目标区域的前段空间与后段空间都是可控的内存区域。
一般来说想要控制的目标区域多为返回地址或是一个函数指针,正常情况下,该内存区域我们是无法通过输入数据来进行控制的,想要利用hos攻击技术来改写该区域,首先需要我们可以控制那片目标区域的前面空间和后面空间。
2. 存在可将堆变量指针覆盖指向为可控区域,即上一步中的区域。
1. fake chunk的ISMMAP 位不能为 1,否则会调用munmap_chunk函数去释放堆块。
2. fake chunk的地址需要对齐, MALLOC_ALIGN_MASK。
3. fake chunk的size 大小需要满足对应的 fastbin 的需求。
4. 2 * SIZE_SZ < next chunk size < av->system_mem 。
5. fake chunk 对应的 fastbin 链表头部不能是该 fake chunk,即不能构成 double free 的情况。
LCTF就是XDCTF,由西电的L-Team主办。
64位程序
除了RELRO,其他保护都关闭
有两个函数,第一个函数就是设置程序的缓冲区,重命名为setvbufs,不再赘述。第二个函数就是程序的主体了。这里重命名为welcome。
1)首先打印“who are you”,然后for循环以输入进行回答,接着打印输入。
2)这里的for循环存在 off by one 漏洞 ,利用后面的pirntf能 泄漏出welcome栈帧中存储的old rbp ,也就是能泄漏出栈里的某个地址。
3)再接着就是输入id和输入money以及菜单操作。
因为,这里能泄漏栈空间地址,所以解题和栈有关(学习的时候是上帝视角,知道这里用HOS,肯定是和栈有关的 - -)。那么根据分析,可得到此时栈空间布局如下:
将输入转为int型,然后返回。该函数有返回值,但是上面的welcome函数伪代码中却没有变量接收返回值。查看汇编,其实是有的,保存在[rbp-0x38],只不过这里是IDA反编译不准确。
到这的时候,栈空间布局如下:
1)malloc了一个0x40大小的堆空间,并将返回地址赋值给指针dest。
2)然后往0x38大小的栈缓存区buf输入“money”,最大大小为0x40,这里存在 相邻变量覆盖,覆盖掉的是dest ,即这里 可以覆盖堆指针 。这可以从buf == [rbp-40h] 和 *dest = [rbp-8h] 看出,也可以双击变量查看它们的栈结构,这里不再贴图。
3)接着将buf内容(输入的“money”)拷贝到dest指向的堆块中。
4)将dest赋值给全局指针ptr,即ptr也指向堆块,当然如果dest被覆盖了,ptr也就会随之改变。
5)执行菜单操作。
此时,栈空间布局如下:
图中money_menu函数input_money_and_menu函数,缩写是为了图片的整齐。
1)输入1 :checkin
2)输入2:checkout
根据ptr指针来判断用户是否登记:
1)如果登记,返回已登记字符串,退出函数;
2)如果没有登记,则输入一个数字nbytes,然后新分配一个nbytes大小的堆空间,然后往里输入“money”(nbytes长度)。
根据ptr指针判断,如果用户已经登记,则free(ptr),并将ptr置为0。
welcome函数中首先回答“who are you”的for循环中存在off by one 漏洞,能泄漏出栈的地址;
input_money_and_menu函数中首先出现malloc操作,而且能通过输入money覆盖堆指针;
checkin函数:malloc一个指定大小的堆块,并往里输入
checkout函数:free并置全局指针ptr为NULL
能泄漏栈的地址,能覆盖堆指针,能再次free和malloc,满足HOS的利用条件。对应前面的利用场景,如下所示,那么可以在可控2区域输入shellcode,可控1区域开始伪造chunk,然后往chunk输入,覆盖input_money_and_menu函数的返回地址为shellcode的地址,那么menu菜单第3选项退出的时候,input_money_and_menu也会return。
下面进行调试分析,验证一些分析。
对于money,如果输入0x38位,那么实际输入的会是0x39位,因为read函数也会将'/n'输入到内存中,结果是会覆盖掉dest最低的一个字节,导致不能查看堆信息。
对于id,也是同样如此,输入4位
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2021-3-8 16:40
被ztree编辑
,原因:
上传的附件: