pwn工具箱之fastbin attack

fastbin attack

基本信息

  • 利用類型: 堆利用
  • 堆利用類型: 針對fastbin的利用
  • 利用思想: 利用fastbin的free只檢查是否和上一個freechunk相等,使得同一個chunk兩次進入free list,造成UAF,可以更改fastbin free chunk的fd信息,最終分配一個特定地址

利用難點

  1. 需要能夠兩次free同一個chunk
  2. 更改fd的時候,爲了能夠在之後的malloc之後返回這個值,需要通過一個check,會檢查fd指向的這個位置的size(這個位置可以不用對齊),看是否屬於正要malloc的這個bin的範圍。

詳細信息

fast bin的free檢查了比較多的東西,所以這裏就不再都貼出來了,其漏洞的主要原因在於fastbin
的實現其實是一個單鏈表實現的棧,後進先出,free的時候只檢查了這個棧的棧頂,這樣的話,
只要不是連續的free兩次同一個chunk,就可以順利的將一個chunk放進free list。之後的分配會使得
chunk雖然在free list裏,但是也被分配了出來,這樣就可以更改到fd指針,使其指向其他位置。

檢查棧頂的代碼如下:

    /* Check that the top of the bin is not the record we are going to add
       (i.e., double free).  */
    if (__builtin_expect (old == p, 0))
      {
        errstr = "double free or corruption (fasttop)";
        goto errout;
      }

需要注意的一點是,在分配的時候還有一個檢查:

          if (__builtin_expect (fastbin_index (chunksize (victim)) != idx, 0))
            {
              errstr = "malloc(): memory corruption (fast)";
            errout:
              malloc_printerr (check_action, errstr, chunk2mem (victim), av);
              return NULL;
            }
          check_remalloced_chunk (av, victim, nb);

這個檢查是指即將分配的這個chunk大小應該在其相應大小的idx上,比如size都爲0x20大小的
fastbin,能夠接受的值就是0x20-0x27範圍,分配過去應該有這個範圍的值(被當做size),
否則將會出現memory corruption。

所以利用的時候需要想辦法找到一個相應的size,這個size其實是不需要對齊的,所以可以通過
錯位的方式構造一個假的size值出來。找到相應的size就可以進行分配到相應位置了。

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