# 2021 MyFirstCTF Write Up
這次也參加了AIS3的MyFirstCTF競賽,裡面是一些AIS3的題目跟額外的baby友善題(結果賽中都解baby題QAQ),好像蠻少人在打MyFirstCTF的Write Up的,就來整理一下吧~不過好像比較多梗題的部分(O
P.S. 但是因為大部分的東西都被我刪了所以可能有點簡略敬請見諒QAQ
這次的成績17名+兩題首殺~好像很普通w

# 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檔。

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=awertyjasqrmnk.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://www.ezyzip.com/unzip-files-online.html)就讓我解開了,而且不需要密碼~
P.S. 這題應該是偽加密,但是我其實到現在還是沒搞懂它的原理是什麼XXD

P.S. 是星野源欸~
FLAG:
```
AIS3{看好了世界,我只示範一次如何一天搶走幾億人的老婆}
```
> 結果新垣結衣跟星野源還是結婚了~
# Web
## Copy & Paste [baby]
這題給了一個奇怪的黑色網站,有一個flag按鈕,按下去之後會顯示個幾秒flag之後消失。但是,他的flag大到我只看到中間部分,沒辦法送啊?
按了F12之後看一下發現他好像用算的把螢幕高度anchor住了,所以我的螢幕不夠長就看不到完整的flag。那有什麼方法可以讓完整的flag顯示出來?
後來腦洞大開把瀏覽器壓扁之後,他的height變小,我就可以看到完整的flag了!
P.S. 通靈用在這裡是正確的(O

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!```...

不過在裡面發現了一個可疑的function```check_flag_is_correct(char *)```,進去看看decompile的內容。

看起來是個判斷傳入字串是否符合條件的函數,點進target發現有一串數字。

看來是把這些數字拿來比對運算結果,所以我們就把條件判斷爆搜字串之後就可以拿到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`