HITCON CTF 是台灣第一個舉辦的 CTF 國際賽事,由 CTF 隊伍 HITCON 於 2014 年第一次主辦,前身是 HITCON Wargame,但因為考慮到每年玩 Wargame 就沒辦法好好聽議程,而且配合 conference 舉辦比賽也會影響 CTF 的題目品質,因此在 2014 年開始變成獨立事件,並更名為 HITCON CTF
,開放給全世界所有的 CTF 隊伍參賽,而不只有參加 conference 的會眾
參加 CTF 的 HITCON 隊伍並不是 HITCON,外界經常會有混淆的情況,因為提到 HITCON 可能會有三種不同的解釋,比斯斯還多一種:
HITCON CTF Team
註冊 CTF 隊伍名稱太冗了,所以都用 HITCON
註冊隊伍解決完 「一個 HITCON,各自表述」 的問題之後,再回頭看一下 HITCON CTF 的定位,可以大致明白:HITCON CTF 是由 HITCON CTF Team 籌辦、HIT 出資,在 HITCON 大義之下舉辦的一場 CTF 競賽......,我快要不知道自己在寫什麼了,這個問題就先打住好了 XDD
Capture The Food
為主題,結合台灣美食和 CTF 題目,獲得參賽隊伍的一致好評最後宣傳一下,今年的 HITCON CTF 2019 會在 Oct 12 10:00 AM ~ Oct 14 10:00 AM (台灣時間) 舉行,並且今年恢復舉辦 final,請各位敬請期待 (?)
HITCON CTF 經典的題目有很多,但最經典的莫過於在 HITCON CTF 2016 由 angelboy 設計的 babyheap
,之所以經典的地方在於:
就來看一下這題是如何設計的,導致在高手雲集的情況下,還可以坑到這麼多人 (?)
題目是個 heap 基本的選單題,運行起來有四個功能:
1 . New
新增 Note,Note 的結構如下:
struct Note {
__int64 len;
char name[8];
char *content;
};
先 malloc
Note,之後輸入 len 再 malloc
content 並取得內容,最後才輸入 name
exit
結束程式2 . Delete
刪除 Note,照順序把 content 和 note free
掉,使用過後會在 bss 設定 flag,再次使用此功能就會直接 exit 結束程式
3 . Edit
編輯 content 的內容,使用過後會在 bss 設定 flag,再次使用此功能就會直接 exit
結束程式
4 . Exit
結束程式前會用 scanf("%2s", buf)
接收 y/n 進行確認,不等於 n 都會 exit
結束程式
這題的坑點在於,題目故意設計成一次只能操作一個 Note,即使找到 off-by-one 也無法構造 heap chunk 進行利用,由於當時的時空背景在 Ubuntu 14.04 當道、16.04 剛 release 的階段,在還沒放提示之前完全沒有人知道 16.04 glibc 實作 scanf 時,使用的 buffer 改成在 heap chunk 上操作......XD,也就是說,如果一開始先透過 4. Exit 的 scanf 得到足夠長的 input 之後,heap 上就會多出一個大小為 0x410 的 chunk 可以使用,可以利用這邊來偽造 heap chunk,配合 off-by-one 的漏洞和 Delete 的功能,可以達成 fastbin attack
具體步驟如下:
n
避免結束程式\x10
改成 \x00
free
content 時因為 ptr 少了 0x10,會把 scanf
構造的 fake size 取出當成 fake chunk free 掉放進 fastbin這題後續還要利用 pwn 題的一些小技巧,像是將 atoi
改成 printf
做 fmt string attack,才能 leak address 最後 shell out,但就不算是難倒大家的原因了,主因還是 scanf
操作 heap 的行為沒人想得到,這也是首次往 glibc 內部的行為做文章的 heap 題,讓 heap exploit 的難度又上升了一個台階,也讓 CTF 越來越沒有人性了 (X)