# THJCC CTF writeup ###### tags: `CTF` `資安` :::warning 我是 THJCC_ffting 啦 第一次參加這種個人賽好興奮RRRRRR 最後拿了21名! ![image](https://hackmd.io/_uploads/r1P1N0HzA.png) ::: ## Welcome ### Welcome 0x1 1. 找到前半段flag在題目分數下面 2. 後半flag在規則最下面 ![image](https://hackmd.io/_uploads/S1ZFC0YW0.png) ![image](https://hackmd.io/_uploads/BJF600tZ0.png) 🧊心得: 這題是我在高鐵上用手機解的哈哈哈哈 ((那天去台南比女婕思 找第二段只花5秒鐘,但找第一段找了大概5分鐘 ### Discord 0x1 1. 用機器人指令 `/cat`,發現可以填檔案名稱 2. 直接`/cat flag.txt`,找到第二段flag ~~((其實我順便把其他檔案都看了一遍~~ 3. 找找其他地方 4. 發現身分組有第三段flag 5. 發現封面有第一段flag ![image](https://hackmd.io/_uploads/ry3ugkqbR.png) ![image](https://hackmd.io/_uploads/BJkQlJ9-C.png) 🧊心得: 這也是在高鐵上解的>< 因為上過OsGa開的Discord Bot所以最快找到的是藏在指令的哈哈哈 大概過了3分鐘後才找到身分組也藏了flag 又過了不知道多久突然發現自己是眼殘,最大的居然最晚看到 ## Misc ### 原神帳號外流 1. 用wireshark打開封包 2. 找出有關login的資訊 3. 找到 - Curios : yyds - H3llo_W0r1d : Meowmeow - dkri3c1111111111111@123123 : qqqqq - admin404 : 404notfound - HaHaHahAAAA : asdfdfdaadf - Frieren : B3stan1me 4. 用`Frieren : B3stan1me`成功登入,拿到flag ![image](https://hackmd.io/_uploads/BkzEoUjWA.png) 🧊心得: 其實這是我第一次用wireshark,總之就是找到之後都試試 化學老師教我們寫這種題目的時候要從最後一個往前檢查 ~~所以其實我一開始就找到了~~ ### 出題者大合照 直接照著這個文章做 https://ithelp.ithome.com.tw/m/articles/10278964 ![image](https://hackmd.io/_uploads/Sk8W_UibC.png) 🧊心得: 我一開始把他丟去[fotoforensics](https://fotoforensics.com/),結果什麼都沒有 後來看提示才解出來,又學到一個酷工具了! ### PyJail-0 題目: ![image](https://hackmd.io/_uploads/rycBqJ8zR.png) 1. 先看一下 server.py,發現可以輸入東西 2. googe一下pyjail相關的東西 3. 找到可以輸入 `__import__('os').system('sh')`拿到shell 4. ls看有什麼酷東西 5. 發現flag.txt,把它cat出來 ![image](https://hackmd.io/_uploads/BJv5kis-0.png) 🧊心得: 超酷的東西,第一次遇到欸哈哈哈哈 原來`eval(a)`,當a輸入是程式碼的時候可以執行它 ### GeoGuessor 1. 看到了一個超大電話號碼 2. google一下,找到這間補習班 3. 再用google map看一下經緯度 ![image](https://hackmd.io/_uploads/HkL3ViobC.png) 🧊心得: 我經緯度打錯超多次>< 第一次直接複製google map的,然後四捨五入但它好像太精確了 第二次跟上面一樣,但改成無條件捨去,還是沒過 後來直接照著預覽的打,無條件捨去就過了 ### I want to go to Japan 1. 直接google關鍵字`shrine seira yunokawa` 2. 找到神社名字 3. 再用google map看一下經緯度 ![image](https://hackmd.io/_uploads/r1l-83oZR.png) 🧊心得: 這題跟上一題差不多,但這題感覺比較簡單(?) ### PyJail-1 題目: ![image](https://hackmd.io/_uploads/H1GFdnoZC.png) 1. 看一下程式碼,發現有字數限制,只能輸15個字 2. 沒辦法input我想要input的東西就再創造一個可以input的地方 3. 輸入`eval(input())` 4. 再輸入一次`__import__('os').system('sh')`拿到shell 5. 一樣ls之後看到flag.txt再把它cat出來 ![image](https://hackmd.io/_uploads/SkcZK3iWR.png) 🧊心得: 經過了pyjail-0的歷練,~~我現在已經可以成熟的找到payload了~~ ### Evil Form 1. 打開F12,看到第一段flag ![image](https://hackmd.io/_uploads/HJ0bnDsbA.png) 2. base64解碼,拿到第三段flag ![image](https://hackmd.io/_uploads/H1QX0wjbC.png) 3. 看到眼睛痛,把它丟去可以變好看的地方 ![image](https://hackmd.io/_uploads/Skviik2ZR.png) 4. 用[線上工具](https://www.dcode.fr/cipher-identifier)找一下怎麼解碼,他說是ROT-47 Cipher ![image](https://hackmd.io/_uploads/rJjX3k3-0.png) 5. 一樣用工具解碼,拿到第二段flag (直接點上一個步驟的ROT-47 Cipher他就會帶你過去解碼的地方了) ![image](https://hackmd.io/_uploads/HkfDhyh-A.png) 🧊心得: 第一跟第三段超快就解完,但第二段卡超久 一開始沒有把它變漂亮就查到它unicode過 `w24<<<<E96 --> w24\u003c\u003c\u003c\u003cE96` 但又看不出來`w24<<<<E96`可以變什麼 後來才找到dcode.fr居然有cipher identifier的功能 所以就成功解出來了! ## Reverse ### BabyC 題目: ![image](https://hackmd.io/_uploads/By9L2Bob0.png) 1. 先看程式碼找出判斷方式 2. 再寫個python逆推回去 - 補個簡化過的程式碼 ```python= a=[44, 48, 50, 59, 59, 3, 16, 12, 12, 8, 11, 66, 87, 87, 15, 15, 15, 86, 1, 23, 13, 12, 13, 26, 29, 86, 27, 23, 21, 87, 15, 25, 12, 27, 16, 71, 14, 69, 75, 32, 59, 46, 53, 75, 63, 75, 8, 22, 11, 5] s = [] for i in a: s.append(chr(i^120)) flag = "".join(s) print(flag) ``` ![image](https://hackmd.io/_uploads/rkGVhrjbA.png) 🧊心得: 讓我複習了我年久失修的python哈哈哈哈 而且好久沒在powershell上寫程式了,~~果然還是一樣難寫~~ 之後我要直接用vim寫(x) ### pyc Reverse 題目: ```python from FLAG import FLAG from Crypto.Util.number import bytes_to_long def xor1(flag): return flag ^ 124789 def xor2(flag): return flag ^ 487531 def xor3(flag): return flag ^ 784523 def xor4(flag): return flag ^ 642871 def xor5(flag): return flag ^ 474745 flag = bytes_to_long(FLAG) count = 0 count += 1 if count == 1: flag = xor1(flag) count += 2 if count == 3: flag = xor2(flag) count += 1 if count == 4: flag = xor3(flag) count -= 2 else: flag = xor2(flag) count += 1 else: flag = xor3(flag) count += 5 if count == 2: flag = xor4(flag) elif count == 6: flag = xor5(flag) print(flag) flag = 10730390416708814647386325276467849806006354580175878786363505755256613965929606057246313695 ``` 1. 先丟線上工具看原程式碼 [Python Source Code Compile and Decompile Online](https://www.lddgo.net/en/string/pyc-compile-decompile) 2. 照著程式碼邏輯逆推回去 - 補個簡化過的程式碼 ```python= 題目給的xor函數們記得抓進來 flag = 10730390416708814647386325276467849806006354580175878786363505755256613965929606057246313695 FLAG = long_to_bytes(xor1(xor2(xor3(xor4(flag))))) print(FLAG) ``` ![image](https://hackmd.io/_uploads/HkoybIoZ0.png) 🧊心得: 第一次去參加女婕思的時候好像也遇到過類似的題目 但那時候什麼都不知道,我感受到我進步了哈哈哈哈哈 好久沒寫reverse的題目了,快樂! ## Pwn ### nc 1. nc連進題目給的 `23.146.248.36 30000` 2. 照著它問的給他答案 `Rick Astley` ![image](https://hackmd.io/_uploads/r1c92RFbC.png) 🧊心得: 大家應該都會nc吧 話說我那時候還有點不敢點進網址哈哈哈哈 ((我那天才知道原來Rick的全名長這樣 ## Crypto ### 博元婦產科 1. 題目上那串看起來就是base64編碼過的東西先解碼 2. 跑出一個看起來就是凱薩加密過的東西再解密 3. flag就出來了 ![image](https://hackmd.io/_uploads/r1PiI8oZA.png) ![image](https://hackmd.io/_uploads/rJjTLIsbA.png) 🧊心得: 古典密碼學簡簡單單 而且他們都長得一臉我就是base64跟凱薩的樣子 ### BabyRSA ~~直接丟線上解密工具~~ ![image](https://hackmd.io/_uploads/rJqxgvoZA.png) 🧊心得: 線上工具真好用(?) 其實是因為我本地端一直沒辦法跑要gmpy2跟Cryptodome的程式 正在努力解決中...... <更新> 我成功把它裝在kali上了! ## Web ### Empty 1. 打開F12看到一串base64編碼過的東西 2. 用線上工具解碼,找到前半段flag 3. 發現程式碼標頭好像有藏酷東西 4. 從網址列前往`/Wh4leE4tSh4rk.html`,找到後半段flag ![image](https://hackmd.io/_uploads/By43INj-A.png) ![image](https://hackmd.io/_uploads/HkkiLNob0.png) ![image](https://hackmd.io/_uploads/H1iku4jZ0.png) 🧊心得: 感覺回到了剛打CTF的時候,回憶都回來了哈哈哈 想當年連base64是什麼都不知道 ### Blog 1. 從EMO那篇文章找到看起來可以是密碼的東西 2. 試試看用`帳號:admin;密碼:iloveshark` 3. 成功登入拿到flag ![image](https://hackmd.io/_uploads/rJDNFNo-C.png) 🧊心得: 這題大概是解最快的,比welcome還快,可能不到1分鐘吧 那個iloveshark看起來就是密碼 ((我也不知道感覺從哪裡來 ## Insane ## 賽後練習 ### Pwn #### NPCS 題目長相: ![image](https://hackmd.io/_uploads/By7uK7SMA.png) 解法: - 感謝 [這位朋友的write up](https://hackmd.io/@hokak/THJCC_CTF_writeup#NPSC) 讓我學會如何用python打競程> < ```python= from pwn import * from Cryptodome.Util.number import * r = remote('23.146.248.36', 30003) r.recvlines(3) for i in range(3): r.recvuntil(f'=============== ROUND 1 ==============='.encode()) for j in range(10): num = r.recvline().strip() num = eval(num) now = 0 max_sum = 0 for k in num: if num >= k: num += k else: if now > max_sum: max_sum = now now = k if now > max_sum: max_sum = now r.sendline(str(num).encode()) print(r.recvline()) r.interactive() ``` 🧊心得: 學測前的我一定寫得出來,現在記憶衰退了QAQ 雖然之前都是用C++寫的競程 但這題自己用pyhton應該也寫得出來吧 pwntools也會用,我真的覺得我!可!以! ### Web #### Simplify 1. 直接用F12把cookie從test改成admin 2. 去看source code 3. 他教我用SSTI去RCE他 ~~((人真好~~ 4. 先試試看怎麼用,發現改網址列有點東西 5. 一樣找到payload然後丟上去 ((放在網址列@後面 ``` {{ config.__class__.from_envvar.__globals__.__builtins__.__import__("os").popen("ls").read() }} ``` 5. 看到有個檔案叫flag,把它cat出來 ``` {{ config.__class__.from_envvar.__globals__.__builtins__.__import__("os").popen("cat flag").read() }} ``` ![image](https://hackmd.io/_uploads/S1amQ4Sz0.png) 🧊心得: 我跑去用Burp Suite看,然後改了cookie,結果那是別題的== ### Reverse #### :baseball: 1. 丟ida到處亂看,看到走進miss裡面會印出flag 2. 看一下main,知道直接把jnz改成jz就好 ----------比賽的時候卡在不會用ida 笑死---------- 3. 要怎麼改呢? - google學一下,原來是用Edit/Patch program/Change bytes 5. 把代表jnz的75改成代表jz的74 6. 改完之後怎麼把它搞回原執行檔呢? - 用Edit/Patch program/Apply patches to input files 7. 下一個問題是在windows是要怎麼執行? - `scp 本地檔案位址 kali@[ip]:要存到kali的位址` - 傳過去之後在kali上執行,成功耶呼! ![image](https://hackmd.io/_uploads/SJ3fITBfA.png) ![image](https://hackmd.io/_uploads/rJcnYaBGC.png) 🧊心得: 在比賽的時候我應該直接去查怎麼用ida的 居然就直接跳過然後忘記回來解了QAQ #### Not Apple 照慣例先感謝 [這位朋友的write up](https://hackmd.io/@hokak/THJCC_CTF_writeup#Not-Apple) 還有 [Huli大大的文章](https://blog.huli.tw/2023/04/27/android-apk-decompile-intro-1/) , 教會我分析apk檔 1. apk檔先丟去online decompiler 2. 把拿到的檔案丟進jd-gui 3. 開始漫長的找東西之路 4. 在sources/com/example/thjcc/MainActivity找到真flag的朋友 5. 它說@string/real_flag 7. 所以去resources/res/values/strings.xml找 8. 找到real_flag的真面目 ![image](https://hackmd.io/_uploads/HJvKQSLGA.png) ![image](https://hackmd.io/_uploads/Hy5KzHUf0.png) 🧊心得: 超酷的,我虛擬機裝著jd-gui但我其實根本沒用過哈哈哈 第一次打apk的reverse,打開檔案的一瞬間我直接被嚇到 這麼多資料夾我是要找到什麼時候 後來看了文章就剛好看到要從哪裡找了,真幸運! ### Crypto 題目: ![image](https://hackmd.io/_uploads/BJA2H-UGR.png) 1. 從題目看出來它的key是從png來的 2. google一下,在[這篇文章](https://crypto.stackexchange.com/questions/88430/how-to-decrypt-two-images-encrypted-using-xor-with-the-same-key)的留言看到好像是用png的固定header 3. 寫個python逆推 - 一樣感謝 [這位朋友的write up](https://hackmd.io/@hokak/THJCC_CTF_writeup#JPGPNG) 讓我可以看到flag本人長怎樣 ```python= from pwn import * key_hex = "89504e470d0a1a0a" #png的固定header key = bytes.fromhex(key_hex) flag = open('enc.txt', "rb").read() with open("flag.jpg", "wb") as f: f.write(xor(flag, key)) ``` 4. 再回到kali把flag.jpg打開 ![image](https://hackmd.io/_uploads/r1GpsW8fA.png) 🧊心得: 比賽的時候照著它的加密方法寫了下面那個東西 然後卡住,就跑去解別題了 我真的很不會分它要hex還是bytes之類的 <附錄> 自己先試寫的 ((完全不能跑,key的元素不能丟hex ```python= from itertools import cycle def xor(a, b): return [i^j for i, j in zip(a, cycle(b))] key = [89, 50, 4E, 47, 0D, 0A, 1A, 0A] enc = open("enc.txt", "rb").read() flag = bytesarray(xor(enc, key)) open('ans.jpg', 'wb').write(flag) ```