House_Of_Orange

D0wnBe@t Lv4

参考

House of Orange - CTF Wiki (ctf-wiki.org)

1.介绍

house of orange 在于我们没有free的时候,一样可以达到free的效果,将一个chunk放进unsorted bin中,然后达到泄露libc的效果

操作的原理简单来说是当前堆的 top chunk 尺寸不足以满足申请分配的大小的时候,原来的 top chunk 会被释放并被置入 unsorted bin 中,通过这一点可以在没有 free 函数情况下获取到 unsorted bins。

  • 正常情况下malloc的执行过程

malloc调用位于libc.so中的__int_malloc函数,该函数中以此检查fastbin,small bins,unsorted bin,large bin,若这些都不满足,则在top chunk中找

  • top chunk也不满足

此时会执行sysmalloc分配chunk

1
2
3
4
5
6
else {
void *p = sysmalloc(nb, av);
if (p != NULL && __builtin_expect (perturb_byte, 0))
alloc_perturb (p, bytes);
return p;
}

但是堆分配有mmap和brk分配方式,我们要用brk的分配方式拓展chunk,这样,之前的top chunk就会放到unsorted bin中,这也就达到了house of orange的利用

一些check

  • malloc的大小要小于mmp_.mmap_threshold(默认128k)
  • sysmalloc函数对top chunk size的check
1
2
3
4
assert((old_top == initial_top(av) && old_size == 0) ||
((unsigned long) (old_size) >= MINSIZE &&
prev_inuse(old_top) &&
((unsigned long)old_end & pagemask) == 0));

简单来说,top chunk的size要大于等于MINSIZE,top chunk的结束地址必须是页对其的,top chunk相邻的前一个chunk必须处于inuse状态。

总结一下check

伪造的size必须页对其

size要大于MINSIZE(0x10)

size要小于之后申请的chunk size + MINSIZE

size的prev inuse位必须是1

然后top chunk就会执行_int_free进入unsorted bin中

  • 标题: House_Of_Orange
  • 作者: D0wnBe@t
  • 创建于 : 2024-10-08 18:35:05
  • 更新于 : 2024-10-08 19:12:47
  • 链接: http://downbeat.top/2024/10/08/House-Of-Orange/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
House_Of_Orange