堆學習入門

藉助hitcon training的題目對三種堆的利用方法進行了一個系統的學習,剛入坑的堆小白們可以一起學習一下。題目鏈接:https://github.com/scwuaptx/HITCON-Training

Use after free

記錄一波建立文件過程
mkdir + name
 touch + name
 echo 'context' > name
 cat name

hacknote(Hitcon training lab10)

這是一個典型的use after free很適合初次接觸的人進行練習

程序功能分析

可以發現是一個note,這裏有三個功能

add_note

可以發現add的功能是添加字條,第一個段是8字節然後用來儲存函數指針 第二段是用來儲存我們的輸入的

del_note

這裏可以發現del是一個刪除操作,但是並沒有讓指針置0所以存在use after free漏洞

ptint_note

是一個調用函數指針的一個過程

解題思路

  • 一、先申請chunk1chunk2其中大小隨意不要超過fastbin的範圍就可以了
  • 二、
  • free chunk1
  • free chunk2
  • 三、此時fastbin中的分佈是
  • chunk2(8) -> chunk1(8)
  • chunk2(32) -> chunk1(32)
  • 四、這個時候申請一個chunk3大小爲8 這個時候系統先分配chunk1(8)的大小存放puts函數 然後分配chunk2(8)作爲我們的context這個時候我們可以在這裏寫上magic函數執行獲取flag

exp:

總結:

簡單的說use after free就是利用free之後指針沒有被設置成NULL然後我們可以在此malloc出來使用。

house of force(Hitcon training lab11)

read函數

第三個參數爲unsigned符號,當-1時及0xffffffff 任意大小讀

利用需要滿足的條件
  • 首先,需要存在漏洞使得我們可以控制top chunksize域
  • 其次,需要我們可以自由的控制malloc分配的大小
  • 分配的次數不能受限制
bamboobox

這裏利用house of force進行利用,題目的下方會對house of force進行一個原理講解

程序功能分析

main
  • 這裏可以發現開始時程序分配了0x10的空間給hello messagegoodbye_message函數
  • 進行一個循環讓我們進行菜單欄選項
menu

這裏可以看見這裏總共有5個選項其中選項1就是show itemremove就是正常的刪除操作,5是正常的退出操作。接下來我們仔細看2,3兩個選項

add a new item
  • 這裏程序先讓我們選擇長度,驚喜驚喜!可以看出長度我們時可以任意控制的,隨意malloc
  • 然後輸入們的item值就可以了
change the item in the box

修改物品的名字,根據給定的索引,以及大小,向指定索引的物品中讀取指定長度名字。這裏長度由用戶來讀入,也存在任意長度堆溢出的漏洞。

magic

這裏有一個我們的flag文件可以讓我們利用

利用思路

  • malloc一個塊
  • 利用change the item in the box進行長度的修改使得我們可以覆蓋到top chunk的size位置修改top chunk size=-1(因爲在其中size是無符號整數-1會被解釋爲0xffffff)所以size肯定就夠我們用了
  • 接着我們利用house of force的方法將top chunk的位置放在heap base地址
  • 然後我們再申請一個0x10的塊,去修改函數指針爲我們Magic的地址 整個利用這樣就完成

exp:

總結:

這裏利用house of force

  • 這個利用過程的條件必須要滿足那三點
  • 然後是修改top chunk的大小
  • 然後是利用malloctop chunk放置到我們需要改寫的那個地址上,可以是got表的地址可以是分配的堆塊地址。

Double free(Hitcon training lab12)

故名思義,就是對一個堆塊進行了兩次free, 但是free了同一個堆塊兩次,其中在glibc中對此有一個檢查

其中是檢查main_arean是否指向向了原來的一個chunk,這個就是非常容易繞過的只需要free(p1);free(p2);free(p1)就可以繞過了。

利用過程

這是我們執行doublefree之後的圖,此時mallocchunk1,更改chunk1fd,又因爲此時chunk1是在fastbin list,也就是結構變成了下圖

可以看見現在fastbin list中會多指向一個我們的fakebin(此時就可以進行任意地址寫了)

check_fail

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

其中會有一個對fakebinsize大小的檢查,如果不滿足當前fastbin鏈中應該有的大小則會顯示異常。

例題:

程序功能分析

main

堆題一般都是些菜單題,這又是一道菜單題

add

add函數就是正常的malloc出堆塊,然後輸入一些數據,這裏並沒什麼漏洞

visit

visit函數就是遍歷剛纔我們所有建立的東西

del

一個刪除函數,其中對指針進行了置0所以無法使用use after free,但是這裏似乎可以利用double free

clean

把所有已經創建了的都進行一個了刪除

magic

這是一個get_flag的函數

利用思路

利用的思路還是比較明顯的,利用double free進行一個got表的改寫。首先add函數建立2個堆塊,然後free(chunk1)->free(chunk2)->free(chunk1)進行一個檢查的bypass。然後再執行add函數,進行chunk1堆塊fd指針改寫,然後連續free出chunk2,chunk1和我們構造的fake_chunk(這個chunk的地址在got表上),對got表進行一個覆寫,將puts函數``got表改寫成magic函數的地址。

注意事項

因爲要bypassfakebin_size的檢查,所以在選got表地址的時候需要gdb調試一下,看存儲的數的低四位滿足要求,這裏就選用了0x601ffa,剛好可以滿足條件

exp:

總結

從這些3個利用方式來看,堆的學習主要是建立在對源碼和對堆分配,回收等操作的熟悉的基礎上。這裏推薦用pwndbg進行調試,還有一些大佬會用gefpeda以及一些插件的方法進行調試,具體看個人的習慣了。

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