---
# System prepended metadata

title: 2021 MyFirstCTF Write Up
tags: [hexo]

---

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