1. 程式人生 > >GDUFS-CTF新手賽划水記錄

GDUFS-CTF新手賽划水記錄

暱稱:字尾自動機Parent樹上啟發式合併
在這裡插入圖片描述
650分簽到。
ctf也太快樂了吧!

應主辦方要求寫WriteUp。

web水題1:
右鍵檢視原始碼,flag get。

web水題2:
看到了一段接收表單就echo flag的php程式碼。寫了個表單,填了個叫noob的引數,提交,flag get。
在這裡插入圖片描述

web水題3:
給了一張餅乾圖。第一反應下載下來字尾改成rar開啟,然後開啟失敗了。然後才反應過來是cookie。檢視cookie看到一條…亂碼?由於沒有其他線索猜測要解密,百度了一下覺得可能是Base64。找了個線上解密,結果提示解密失敗,並且輸出一堆亂碼,差點以為涼了,叉出去之前在亂碼裡看到了flag,get。

web水題4:
點開之後跳轉到了比賽首頁…懵逼之後猜測這一定是假的網站,檢視原始碼後發現臥槽,這是真的。回頭去查看了點進來那個按鈕的原始碼,發現並不是我開啟的那個網站。再開一次,臥槽,竟然是跳轉。然後再開了一次快速點下了瀏覽器的停止載入阻止了跳轉。檢視原始碼,flag get。

web水題5:
又是一段php程式碼。仔細看了一下,好像是個登入介面,感覺突破口應該在雜湊演算法上。於是百度sha1漏洞,然後就找到了原題…
原來可以用陣列撞破,把連結後面加上:

/?name[]=1&password[]=2

flag get。

RE1:
下載下來一個exe,雙擊執行,執行失敗,????
右鍵edit with notepad++,臥槽,flag get。

simple_re:
又下載下來一個exe,雙擊執行,讓我輸入flag?沒有啊,告辭。
然後發現這是一個C#窗體…想起來昨天忽然有人問我C#怎麼反編譯,然而他並不告訴我為啥他要問這個,好的,現在我知道了,ilspy啟動!
找到窗體主程式部分,發現一個意☆義☆不☆明的Hash函式,找到了獲取flag的方法,hash結果逆向可以求出flag。
感覺他在前面瘋狂暗示我用md5,然而解密失敗,只好自己去寫程式暴力破解。
想了一下好像可以寫個dfs列舉,但是太晚了懶得思考,先敲個暴力再說。我猜flag的前面肯定是“GWHT{”,所以先填上這些,然後 O

( n ³ ) O(n³) 在ASKII可見字元範圍內暴力列舉,一次列舉3位,然後從中取兩位有效的,每求出兩位就終止程式,改改程式碼調調參繼續列舉下一個。

	for(int i = 32; i <= 126; i++) {
		get.push_back((char)i);
		for(int j = 32; j <= 126; j++) {
			get.push_back((char) j);
			for(int k = 32; k <= 126; k++) {
				get.push_back((char) k);
				string h = hash(get);
				cout << h << endl;
				if(h.find("LEGV") != string::npos) {
					cout << "find:" << h << endl;
					cout << (char)i << (char)j << (char)k <<endl;
					return 0;
				}
				get.pop_back();
			}
			get.pop_back();
		}
		get.pop_back();
	}

我感覺列舉的差不多了就直接在最後填上了“}”,測試,完美,flag get!

貝斯:
根據hint,base系列亂搞,我也不知道怎麼搞的,解碼來解碼去就有了flag。

你是萌新嗎?:
我是哦。
下載下來一張圖。右鍵字尾改成rar,哇,這次打開了。發現壓縮包x1,解壓,臥槽居然有密碼,找了一圈沒有哪有密碼提示,百度了一下,用winhex炸掉密碼,成功解壓。
然後解壓出來一堆文字文件。
我猜肯定是做匹配找不同啦,趕緊寫個字尾自動機 暴力匹配就完事了。
Eclipse啟動,寫了以第一個檔案為母本,其他的跟他匹配的程式(為什麼會這麼做…?因為第一個檔案沒加編號我不能用for迴圈一次讀入只能單獨讀入就這麼搞了),遇到不同的字元就輸出,感覺flag大概就只有這麼長,不會有多的不同字元吧。
程式沒有bug,執行之後立馬出flag,非常舒服。
在這裡插入圖片描述