# 2021 MyFirstCTF Write Up 這次也參加了AIS3的MyFirstCTF競賽,裡面是一些AIS3的題目跟額外的baby友善題(結果賽中都解baby題QAQ),好像蠻少人在打MyFirstCTF的Write Up的,就來整理一下吧~不過好像比較多梗題的部分(O P.S. 但是因為大部分的東西都被我刪了所以可能有點簡略敬請見諒QAQ 這次的成績17名+兩題首殺~好像很普通w ![](https://i.imgur.com/NtHPsgc.png) # MISC ## Cat Slayer ᶠᵃᵏᵉ | Nekogoroshi 這題跟AIS3 Pre-exam是一樣的題目,直接複製XD 題目給了一行command ```bash TERM=xterm-256color ssh -p 5566 h173@quiz.ais3.org ``` 把它拿到Terminal執行後可以發現他跳出了一個Python的執行畫面,用鍵盤可以輸入數字,輸入錯誤會鎖起來,因此可以用手動的輸入猜密碼,得到正確的密碼就可以解鎖flag。 ``` Password: 202583045529 ``` FLAG: ``` AIS3{H1n4m1z4w4_Sh0k0gun} ``` ## [祝賀] 新垣結衣新婚快樂 發錢囉 [baby] > Bonus : First Blood 這題給了一張圖片,看起來像是forensics,所以先用一些例如zsteg或online tool之類的工具試了一下,後來用binwalk試了一下發現裡面包了一個zip檔。 ![](https://i.imgur.com/g264BDQ.jpg) P.S. 是新垣結衣欸~ ``` $ binwalk baby.png DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 0 0x0 PNG image, 1200 x 675, 8-bit/color RGB, non-interlaced 179 0xB3 Zlib compressed data, best compression 1511327 0x170F9F End of Zip archive ``` 所以用foremost把裡面的東西拉出來。 ``` $ foremost baby.png -o baby Processing: baby.png |foundat=awertyjas‮qrmnk‮.pngt�w4����?�ik� m��T�ԦZ{�ڵ�J���F�U�k�=�P����&VlAD��z�>�?��|Ϲ�x:�p?������}ߏ�k�+RS0S *| ``` 接下來到```/baby```可以發現一個```00001726.zip```,裡面有一張圖片,推測應該是flag,但是local需要密碼解鎖,猜了幾個常用密碼跟照片名還是錯誤,所以開始找online tool。 ![](https://i.imgur.com/IJQc2PA.png) 非常幸運的是我[第一個使用的網站](https://www.ezyzip.com/unzip-files-online.html)就讓我解開了,而且不需要密碼~ P.S. 這題應該是偽加密,但是我其實到現在還是沒搞懂它的原理是什麼XXD ![](https://i.imgur.com/fIGvBh8.png) P.S. 是星野源欸~ FLAG: ``` AIS3{看好了世界,我只示範一次如何一天搶走幾億人的老婆} ``` > 結果新垣結衣跟星野源還是結婚了~ # Web ## Copy & Paste [baby] 這題給了一個奇怪的黑色網站,有一個flag按鈕,按下去之後會顯示個幾秒flag之後消失。但是,他的flag大到我只看到中間部分,沒辦法送啊? 按了F12之後看一下發現他好像用算的把螢幕高度anchor住了,所以我的螢幕不夠長就看不到完整的flag。那有什麼方法可以讓完整的flag顯示出來? 後來腦洞大開把瀏覽器壓扁之後,他的height變小,我就可以看到完整的flag了! P.S. 通靈用在這裡是正確的(O ![](https://i.imgur.com/CrzUGc1.png) FLAG: ``` AIS3{Re33Ee3E33e3eEEe3eE3El11I1l1i11y_lo0O0oo00o00oOC0OOoo00o0Oo0O0o0Ooo0Oo0oo0Oo0OOOO000OO0ng_f1aG} ``` P.S. 所以我還是不知道怎麼複製貼上w而且這個flag我打好久QQ 不過還好手打,賽後用OCR跑出來的是錯的啦= = # Crypto ## Judgement [baby] 這題的題目很簡潔,只有一個```Judgement.py```跟一個```output.txt```。 ```python from hashlib import sha256 import string flag = 'AIS3{THIS_IS_A_FAKE_FLAG}' cand = string.ascii_letters + string.digits + '_{}' charset = string.printable[:93] enc = '' for c in flag: assert(c in cand) enc += charset[int(sha256(c.encode()).hexdigest(), 16) % len(charset)] print(enc) ``` ``` )g;Fk@>2g;2V2J?d5G3_8V2<dR2i5GZ@<?2)g\j_2V&?2;@[F@ek2_3"=k&;2)\F2J9LL4g[W2"[2<)RZ23@<?2elFZ?2=@jZ23@=F2Yi52;lL5Vj2J?2J8\e@eW23e2lF330 ``` 第一個想法是逆推,但是它裡面用了sha256加密後的某個位置的字元,所以也沒辦法直接逆推,只好用順向搜尋的方式解題。 但因為他取sha256的字元,逆推後並不只一種可能性,所以我們用不同的ascii碼範圍搜尋可能字元後,因為題目提及flag符合文法與leet語法,再用手動來把flag拼出來。 先把爆搜的程式寫出來。 ```python from hashlib import sha256 import string g=")g;Fk@>2g;2V2J?d5G3_8V2<dR2i5GZ@<?2)g\j_2V&?2;@[F@ek2_3\"=k&;2)\F2J9LL4g[W2\"[2<)RZ23@<?2elFZ?2=@jZ23@=F2Yi52;lL5Vj2J?2J8\e@eW23e2lF330" s="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\"#$%&'()*+,-./:;<=>?@[\]^_`{|}" for i in range(133): for j in range(127,64,-1): # range(65,128), range(48,128) if s[int(sha256(chr(j).encode()).hexdigest(),16)%93]==g[i]: print(chr(j),end='') break ``` 跑出了三種結果: ``` AISv{iX_IS_M_BeautqM_day_~utside_AIr|q_MRe_SiNvin{_qow{RS_Arv_BlOOmIN_oN_dAys_ide_nhvse_wi|s_iwv_Y~u_ShOuM|_Be_Brnin_n_hv} AISGEiT_IS_L_BeaZtFUL_Kay_~ZtsiKe_AIrDF_LRe_SiNGinE_FoQERS_ArG_BlOOmIN_oN_KAys_iKe_nhGse_QiDs_iQG_Y~Z_ShOZLD_Be_BUrnin_n_hG} 8IS39iT_IS_4_BeaZ215=4_Kay_0Z2siKe_8IrD5_4Re_SiN3i79_51oQ9RS_8r3_BlOO@IN6_oN_K8ys_1iKe_7h3se_QiDs_1iQ3_Y0Z_ShOZ4D_Be_B=r7i76_17_h311} ``` 剩下就是手動拼組了,不過可以確定range(48,128)的字串長度必定為flag長度,因其包含了所有flag可能字元。 FLAG: ``` AIS3{iT_IS_4_Beaut1FUL_day_0utside_8IrD5_4Re_SiNGin9_F1owERS_Ar3_BlOOmIN6_oN_dAys_1iKe_7h3se_kiDs_1ik3_Y0u_ShOuLD_Be_BUrnin6_1n_h311} ``` P.S.我拼了1.5hr錯了10次才對,1t's 4 re41 h31l... # Reverse ## ⒸⓄⓋⒾⒹ-①⑨ [baby] > Bonus : First Blood 這題直接給了一個x64的task.elf檔,既然是reverse就直接用IDA Pro打開吧~ Decompile之後先看看main,沒有找到什麼可以用的東西,function多到暈頭轉向,看到的東西只有```YOU WIN!```... ![](https://i.imgur.com/uIRgngL.png) 不過在裡面發現了一個可疑的function```check_flag_is_correct(char *)```,進去看看decompile的內容。 ![](https://i.imgur.com/yQDTxXZ.png) 看起來是個判斷傳入字串是否符合條件的函數,點進target發現有一串數字。 ![](https://i.imgur.com/XICIwSx.png) 看來是把這些數字拿來比對運算結果,所以我們就把條件判斷爆搜字串之後就可以拿到flag了。 寫個程式來把flag爆搜出來。 ```cpp #include<bits/stdc++.h> using namespace std; int p[32]={65, 72, 81, 48, 127, 48, 49, 51, 113, 86, 98, 59, 97, 62, 114, 120, 35, 37, 96, 76, 121, 33, 35, 124, 101}; int main(){ for(int i=0;i<32;i++){ for(int j=0;;j++){ if(char(char(j)^i)==char(p[i])){ cout<<char(j); break; } } } return 0; } ``` FLAG: ``` AIS3{574y_h0m3|w34r_m45k} ``` P.S. 賽後發現xor算法可以直接算出flag,不需要爆搜,比賽的時候沒想好繞了一圈... ```cpp #include<bits/stdc++.h> using namespace std; int p[32]={65, 72, 81, 48, 127, 48, 49, 51, 113, 86, 98, 59, 97, 62, 114, 120, 35, 37, 96, 76, 121, 33, 35, 124, 101}; int main(){ for(int i=0;i<32;i++){ cout<<char(i^p[i]); } cout<<endl; return 0; } ``` ###### tags: `hexo`