AIS3 CTF Final Phddb Write-up

程式概述

程式為一個儲存 phd 的 profile 的 database ,有 dump、add、edit 及 remove 等功能

漏洞

  • Use After Free

    • 有問題的地方在於 edit 這個功能

      我們可發現到,thesis 的 size 是由使用者輸入的,一開始會先判對是否跟 struct 中所存的 length 相同,不相同則去 realloc 重新分配 heap 的空間,如果分配失敗則直接 invalid length 然後 return ,而判斷 realloc 成功與否的方式則是看 realloc 的回傳值,如果是 NULL 就失敗,但有個特殊情況下 realloc 回傳值也會是 NULL,我們可以用 man realloc 去看一下,可發現到 realloc(ptr,0) 會被當成 free(ptr) 來使用,而在後面也未做 phdlist[v3]->thesis= NULL 清空的動作,造成之後的 Use After Free

漏洞利用

因此我們可以利用 fastbin 的 FILO 的特性,先創造兩個 phd's profile 並讓 thesis 的大小等於 struct phd 的大小,大致上的 layout 如下圖

而我們故意用 editphd 故意 realloc(phdlist[0],0) 也就是 free(phdlist[0]) ,但在 phdlist[0]->thesis 並不會清除

接著我們在 add 一比 phd's profile ,此時會應會 chunk 在 fastbin 的關係,而分配到與剛剛 free 掉的 thesis0 會是相同的

然後我們再編輯 phdlist[0] 也就是第一筆的 phd's profile,但因為 thesis0 指到 phdlist[2] 的關係,因此會更改到 struct ,我們可以藉此將 struct phd 中的 char pointer 改成 got.plt 位置

最後我們在 dump 及編輯 phdlist[2] 就可以達成 infomation leak 去 leak libcbase 以及 GOT Hijacking 改成 system 位置,就可以拿到 shell 了

exploit

phddb.py
裡面有使用到自己的 module 不過跟 pwntool 差不多,習慣用 pwntool 的人就自行轉換了

comments powered by Disqus