2020年12月21日 星期一

109年金盾決賽 - Format string attack

今年的金盾獎決賽有增加特殊的題型,例如IOT (Internet of Things)和教學題,其中教學題的目的在於有參與決賽的學生,如果解不出此題型,可以直接點選詳解,就會顯示完整的解題步驟,達到教學的宗旨。此題的教學題,是要利用Format string attack的技巧來獲取flag,難度差不多是介於中間偏簡單,如果沒有解出此題的同學,還可以再挑戰看看,亦或想要多了解金盾獎決賽題型的方向,也可以研究一下。

 

題目下載連結

https://drive.google.com/file/d/16Fmmql-KTBvuyRrjHP2tWfAHcuSvCuWo/view?usp=sharing

虛擬機下載連結

https://drive.google.com/file/d/1UMW7wuNDBjzfWHZuHELI4XxR67jcw1eN/view?usp=sharing

一、題目介紹

直接執行題目或者連線到虛擬機上的題目,會提示大家要輸入account,輸入完會出現輸入password的提示,最後會顯示是否為正確的password,主要還是找出Format string vulnerability,並且撰寫Exploit code來獲取此題的flag。



二、解答

我們發現,它將[ebp+account](account的輸入參數)的位址移到eax,然後直接調用printf,因為account的參數是使用者可以任意輸入字串,像是%d、%x、%n等等,所以這邊有Format string的漏洞,不過有一個前提條件,在輸入account時,需要有@的字元,不然它不會觸發Format string的漏洞。



找完程式的漏洞,其實還不能獲取到flag,因此要想辦法利用Format string的漏洞,所以繼續往下分析,接下來它會輸入password,然後會透過strcmp來比對字串,因此我們可以覆寫strcmp的GOT(Global Offset Table)來達成我們的漏洞利用並讀取flag。



在調用checkInfo之後,會利用system(“exit”)來結束程式,因此我們將strcmp的GOT替換成system的調用函式位址(plt調用位址),這樣就可以利用ls和cat指令來查看flag的內容。



輸入AAAA@%x.%x.%x.%x.%x.%x.%x.%x.%x,得知輸入的AAAA會在堆疊的第8個位置(41414141)。



使用objdump來獲取strcmp的GOT位址,得知strcmp的GOT位址為0x08049a4c。



利用gdb查看調用system函式的位址(調用plt位址)。



最後建構的Exploit字串如下。

\x4c\x9a\x04\x08\x4e\x9a\04\x08%33820x%8$hn%33760x%9$hn@

Exploit程式碼下載連結

https://drive.google.com/file/d/1Tyz-9k4XUEX5uc2g1UXpQVSQC-tcKoS_/view?usp=sharing