pwn工具箱之house of lore

前言

我看了一些网上对于这些技术的解释,但是发现他们大多比较绕,对于理解其中心思想造成了难度,所以
我在这里把他们记录下来,把这些技术的中心思想记下来,作为自己的pwn工具箱,在以后解决pwn问题的
时候能够随时拿出来发挥作用。

我在这里关注的目标是其利用的思想,和其他的一些post不同,利用条件等等这些我个人认为不是能够直
接被总结的,pwn本身的方法多种多样,十分灵活,如果用一些“第一个chunk”,“第二个chunk”之类的说
法试图去总结一种利用技巧的利用条件反而让人抓不住重心。 想要知道利用条件?抓住思想然后自己分
析就可以轻易得出来他的利用条件了。有时候看起来不符合其他post的“利用条件”,但是根据自己的分析,
可能也是可以利用这些技巧的。

house of lore

基本信息

  • 利用种类: 堆溢出
  • 堆利用种类: 针对smallbin的利用
  • 利用思想: 利用smallbin为双向链表,每次malloc取了链表最后一个元素,可以通过更改链表指针,使
    其分配一个刻意构造的地址

利用难点

  1. 需要一个堆溢出或其他方法能够更改到small bin的free chunk的fd和bk指针
  2. 由于glibc增加的security check,会检查small bin分配的时候,unlink链表中的元素时,bck元素的
    fd是不是指向当前位置,所以只有构造好了将要malloc出来的位置的chunk才能够成功分配。

详细信息

glibc中的关于small bin分配的漏洞相关代码:

static void_t*
_int_malloc(mstate av, size_t bytes)
{
  [...]
  checked_request2size(bytes, nb);
  [...]
  if ((unsigned long)(nb) <= (unsigned long)(av->max_fast)) {
    [...]
  }
  [...]
  /*
    If a small request, check regular bin.  Since these "smallbins"
    hold one size each, no searching within bins is necessary.
    (For a large request, we need to wait until unsorted chunks are
    processed to find best fit. But for small ones, fits are exact
    anyway, so we can check now, which is faster.)
  */
  if (in_smallbin_range (nb))
    {
      idx = smallbin_index (nb);
      bin = bin_at (av, idx);
      if ((victim = last (bin)) != bin)
        {
          if (victim == 0) /* initialization check */
            malloc_consolidate (av);
          else
            {
              bck = victim->bk;                //这里如果可以控制bk,就可以控制即将分配的chunk
    if (__glibc_unlikely (bck->fd != victim))    //security check,所以需要构造一下
                {
                  errstr = "malloc(): smallbin double linked list corrupted";
                  goto errout;
                }
              set_inuse_bit_at_offset (victim, nb);
              bin->bk = bck;
              bck->fd = bin;
              if (av != &main_arena)
                victim->size |= NON_MAIN_ARENA;
              check_malloced_chunk (av, victim, nb);
              void *p = chunk2mem (victim);
              alloc_perturb (p, bytes);
              return p;
            }
        }
    }

这一段代码是malloc的实现中采用smallbin的分配相关内容。

in_smallbin_range用来检验需要分配的大小是不是smallbin大小,如果是就采用smallbin的分配方式,
idx用来查找smallbin中这个大小的idx,然后根据idx取出一个bin,相当于是一个链表head,根据这个
bin,通过last函数查找到最后一个free chunk,之后只要存在这个free chunk,就会在链表中进行
unlink,然后就可以分配了。

漏洞的问题就在于bck = victim->bk,这句话将这个chunk的bck提取了出来,并且在之后使得bin->bk = bck,
这样的话bk指针所指向的chunk就被放入了smallbin,之后的malloc就可以将其malloc出来了。

需要注意的地方是那个security check,判断了bck->fd != victim,所以bck的位置还需要进行一次构造,
使得能够通过这个check。

总的来说,其思路就是通过更改small bin某个free chunk的bk指针,使其指向一个构造好的想要分配地址的
fakechunk,使得smallbin分配能够分配到这个地方。

题目实例(持续更新)

我会将我碰到的符合这个方法的题目和简要分析放在这个部分,还没有碰见的时候会暂时留空。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章