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分配能夠分配到這個地方。

題目實例(持續更新)

我會將我碰到的符合這個方法的題目和簡要分析放在這個部分,還沒有碰見的時候會暫時留空。

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